2017-04-06 49 views
2

我从来没有能够完全理解find命令的-prune动作。但实际上,至少我的一些误解源于省略'-print'表达的效果。使用'-prune'时,将'-print'从'find'命令中省略掉

从“查找”手册页..

“如果表达式包含比其他-prune没有行动,是在该表达式为true的所有文件进行-print。”

..我一直以来(多年)都意味着我可以忽略'-print'。

但是,如以下示例所示,至少在出现'-prune'表达式时使用'-print'和省略'-print'之间的区别。

首先,我有我的工作目录下的以下8个目录..

aqua/ 
aqua/blue/ 
blue/ 
blue/orange/ 
blue/red/ 
cyan/blue/ 
green/ 
green/yellow/ 

总共有10个文件中的8个目录..

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”它不仅返回五个所需的文件,而且其路径名称中包含“蓝色”的任何目录..

% 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

隐含的-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相同的行为。