Bash 省略'-打印';从';查找';当'-修剪';使用

Bash 省略'-打印';从';查找';当'-修剪';使用,bash,find,Bash,Find,我一直无法完全理解find命令的-prune操作。但事实上,至少我的一些误解源于省略“-print”表达的影响 从“查找”手册页 如果表达式除-prune之外不包含任何操作,则会对表达式为true的所有文件执行-print 。。多年来,我一直认为这意味着我可以省去“印刷品” 但是,如以下示例所示,至少在出现“-prune”表达式时,使用“-print”和省略“-print”之间存在差异 首先,我的工作目录下有以下8个目录 aqua/ aqua/blue/ blue/ blue/orange/ b

我一直无法完全理解find命令的-prune操作。但事实上,至少我的一些误解源于省略“-print”表达的影响

从“查找”手册页

如果表达式除-prune之外不包含任何操作,则会对表达式为true的所有文件执行-print

。。多年来,我一直认为这意味着我可以省去“印刷品”

但是,如以下示例所示,至少在出现“-prune”表达式时,使用“-print”和省略“-print”之间存在差异

首先,我的工作目录下有以下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
那么,为什么要显示三个“蓝色”目录


这可能很重要,因为我经常试图删除包含50000多个文件的目录结构。当处理该路径时,我的find命令,特别是如果我对每个文件执行“-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
时出现相同的行为