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到了,不是吗?
本文原创,转载请注名出处