离开' -print'来自'发现'当' -prune'用

时间:2017-04-06 18:26:06

标签: bash find

我从未能完全理解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'对于每个文件,可能需要花费大量时间处理我完全没有兴趣的文件。我需要有信心,发现不会进入被修剪的结构。

1 个答案:

答案 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时具有相同的行为。