我一直无法完全理解 find 命令的 -prune 操作。但实际上,至少我的一些误解源于省略“-print”表达的影响。
从“查找”手册页..
“如果表达式除 -prune 之外不包含任何操作,则对表达式为 true 的所有文件执行 -print。”
..我一直(多年来)认为这意味着我可以省略“-print”。
然而,正如下面的例子所示,有is使用“-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 个文件的目录结构。当处理该路径时,我的 find 命令,特别是如果我对每个文件执行“-exec grep”,可能会花费大量时间来处理我完全不感兴趣的文件。我需要确信 find 不会进入修剪后的结构。