我从未能完全理解find命令的-prune动作。但实际上至少我的一些误解源于省略' -print'表达
来自'发现'手册..
"如果表达式不包含-prune以外的任何操作,则对表达式为true的所有文件执行-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'显示没有' blue'的所有常规文件作为文件路径的一部分。有五个文件符合此要求。
这可以按预期工作..
% 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'对于每个文件,可能需要花费大量时间处理我完全没有兴趣的文件。我需要有信心,发现不会进入被修剪的结构。
答案 0 :(得分:0)
隐式-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
时具有相同的行为。