我一直无法完全理解 find 命令的 -prune 操作。但实际上,至少我的一些误解源于省略“-print”表达式的效果。
来自“查找”手册页..
“如果表达式不包含除-prune 之外的任何操作,则对表达式为真的所有文件执行-print。”
.. 我一直(多年来)认为这意味着我可以省略“-print”。
但是,如以下示例所示,使用“-print”和省略“-print”之间是区别,至少在出现“-prune”表达式时是这样。
首先,我的工作目录下有以下8个目录..
aqua/
aqua/blue/
blue/
blue/orange/
blue/red/
cyan/blue/
green/
green/yellow/
这8个目录下共有10个文件..
aqua/blue/config.txt
aqua/config.txt
blue/config.txt
blue/orange/config.txt
blue/red/config.txt
cyan/blue/config.txt
green/config.txt
green/test.log
green/yellow/config.txt
green/yellow/test.log
我的目标是使用“查找”来显示所有没有“蓝色”作为文件路径一部分的常规文件。有五个文件符合此要求。
这按预期工作..
% find . -path '*blue*' -prune -o -type f -print
./green/test.log
./green/yellow/config.txt
./green/yellow/test.log
./green/config.txt
./aqua/config.txt
但是当我省略“-print”时,它不仅会返回五个所需的文件,还会返回路径名包含“blue”的任何目录..
% find . -path '*blue*' -prune -o -type f
./green/test.log
./green/yellow/config.txt
./green/yellow/test.log
./green/config.txt
./cyan/blue
./blue
./aqua/blue
./aqua/config.txt
那么为什么会显示三个“蓝色”目录?
这可能很重要,因为我经常尝试删除包含超过 50,000 个文件的目录结构。当处理该路径时,我的查找命令,尤其是当我对每个文件执行“-exec grep”时,可能会花费大量时间来处理我完全不感兴趣的文件。我需要确信 find 不会进入修剪后的结构。
最佳答案
隐式 -print
应用于整个表达式,而不仅仅是它的最后一部分。
% find . \( -path '*blue*' -prune -o -type f \) -print
./green/test.log
./green/yellow/config.txt
./green/yellow/test.log
./green/config.txt
./cyan/blue
./blue
./aqua/blue
./aqua/config.txt
它不会下降到修剪后的目录,但会打印出顶层。
稍作修改:
$ find . ! \( -path '*blue*' -prune \) -type f
./green/test.log
./green/yellow/config.txt
./green/yellow/test.log
./green/config.txt
./aqua/config.txt
(使用隐式 -a
)将导致在使用和不使用 -print
时具有相同的行为。
关于bash - 当使用 '-print' 时,从 'find' 命令中遗漏 '-prune',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43263043/