前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >find命令-prune 参数引起的思考

find命令-prune 参数引起的思考

作者头像
qsjs
发布2020-06-09 10:36:00
1.3K0
发布2020-06-09 10:36:00
举报

prune这个英文单词的意思是:修剪,裁剪;在find 命令中的 -prune 参数引申为: 排除的意思; 查看man 帮助文档有下面的一段内容:

代码语言:javascript
复制
[root@localhost ~]# man find | sed -n "/^\( *\)[-]prune/,/^\( *\)$/p" 
       -prune True; if the file is a directory, do not descend into it. If -depth is given, false; no effect.  Because -delete  implies  -depth,  you
              cannot usefully use -prune and -delete together.

[root@localhost ~]# 

这段话初看起来比较费解,解释下有如下几个要点: A. -prune参数属于find 的action , 这个action 返回的结果为True; B. 如果被查找的文件是一个目录,那么不会递归到该目录里面做进一步查找,直白点说就是:如果-prune 匹配的是一个目录,那么就会跳过该目录,不对该目录的子目录以及文件进行查找; C. 如果配合了参数-depth的话,该action 返回的值为false . D. 因为-delete action总是和-depth 一起使用,所以不能把 -prune 和 -delete 这两个action 一起使用;

从这个解释来看,B和D 是比较清楚的,而A和C强调的是返回值 ,难道这个返回值影响我们对find命令的使用? 是的,这个返回值的true 以及 false 影响我们find命令时候多个条件的组合操作; 再看find的man帮助文档,可以找到这么一句话:

代码语言:javascript
复制
EXPRESSIONS
       The expression is made up of options (which affect overall operation rather than the processing of a specific file, and always  return  true),
       tests  (which  return  a true or false value), and actions (which have side effects and return a true or false value), all separated by opera‐
       tors.  -and is assumed where the operator is omitted.

大意是说: find 的表达式是由 options, tests, 和actions 组成的,其中options总是返回true, 而tests , actions返回的结果或者是true, 或者是false. 这些options, testst, action 之间是需要用 operators (这里指逻辑操作符号 -and, -or ... )来连接的,而默认的operators 就是 -and,and 表示前面的表达式结果为真,才会执行后面的表达式;同理,-or 表示前面的表达式为false的时候,才会执行后面的表达式; 所以我们一般使用: find . -mtime +1 -type f -iname "file.c" 这种没有指名operator的find命令的时候,默认是: 多个条件都满足才会匹配,也就是 用了-a operator ;

回过头来看-prune参数,经常被用来排除目录,不做查找操作,比如下面的操作,我需要排除/proc 这个内存文件系统, 然后查找数字作为名称的文件:

代码语言:javascript
复制
[root@localhost ~]# find / -regextype grep -regex ".*/[0-9]\{1,6\}$" | grep proc | head    #没有排除的情况下,我们在/proc下找到了很多以数字命名的文件;
/proc/bus/pci/00
/proc/irq/0
/proc/irq/1
/proc/irq/2
/proc/irq/3
/proc/irq/4
/proc/irq/5
/proc/irq/6
/proc/irq/7
/proc/irq/8
[root@localhost ~]# find / -path /proc -prune -o -regextype grep -regex ".*/[0-9]\{1,6\}$"  | grep proc   #利用-prune 排除之后,没有进入/proc做进一步查找;
/proc
[root@localhost ~]# 

下面对上述find 的查找逻辑做一个简单的分析: -path /proc 属于tests 条件,如果不是/proc , 那么返回值为false, 此时就不会执行-prune action. 因为默认的operator 是and;所以此时,-path /proc -prune的结果就是-path /proc 的结果,也就是false. 而后面的条件需要继续执行,所以需要用-o 参数来 连接;如果遇到的路径是/proc, 那么 -path /proc 返回结果为true, 此时会执行 -prune action,也就是忽略该目录;此时执行到"-path /proc -prune"的结果为true. 后面的条件是不需要进一步执行的,所以 -o 的operator 也是满足条件的;

总结: 要用好-prune参数,关键在于理解 find中的operator操作符,如果只是 知其然而不知其所以然,那么就无法真正的理解并用好它. 相信你一定get到了,不是吗?

本文原创,转载请注名出处

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档