使用find命令排除子目录
这个问题在这里已经有了答案:
继我之前的评论之后,这对我的Debian有效:
find . -path ./ignored_directory -prune -o -name fileName.txt -print
要么
find /path/to/folder -path "*/ignored_directory" -prune -o -name fileName.txt -print
要么
find /path/to/folder -name fileName.txt -not -path "*/ignored_directory/*"
这里的区别很好地辩论
为了补充olivm的有用答案,并在需要-o
解决OP的困惑:
-prune
,因为每个find
主要(操作或测试,在GNU说),返回一个布尔值,并且在-prune
的情况下该布尔值总是为true
。 -a
( -and
),其中,像它的兄弟-o
( -or
)执行短路布尔逻辑。 -a
比-o
具有更高的优先级。 有关所有find
概念的摘要,请参阅https://stackoverflow.com/a/29592349/45375
因此, 接受的答案 ,
find . -path ./ignored_directory -prune -o -name fileName.txt -print
相当于 (括号用于使评估优先级明确):
find . ( -path ./ignored_directory -a -prune )
-o
( -name fileName.txt -a -print )
由于短路适用,评估如下:
./ignored_directory
的输入路径导致-prune
被评估; 由于-prune
总是返回true
,所以短路会阻止对-o
操作符的右侧进行评估; 实际上,没有任何事情发生(输入路径被忽略) ./ignored_directory
,即刻 - 再次由于短路 - 继续在-o
右侧进行评估: fileName.txt
匹配时,才是评估的-print
主要; 实际上,只会打印文件名与fileName.txt
匹配的输入路径。 编辑 :尽管我最初在这里声称, -print
IS在-o
的右侧需要这里; 没有它,隐含的-print
将应用于整个表达式,因此也打印左侧的匹配; 请参阅下面的背景信息。
相比之下,让我们考虑错误地不使用-o
:
find . -path ./ignored_directory -prune -name fileName.txt -print
这相当于:
find . -path ./ignored_directory -a -prune -a -name fileName.txt -a -print
这只会打印修剪后的路径(也与-name
过滤器匹配),因为-name
和-print
-name
与(逻辑)AND(隐式)连接;
在这种特定情况下,由于./ignored_directory
不能与fileName.txt
匹配,因此不会打印任何内容,但如果-path
的参数是glob,则可能会得到输出。
关于find
的一个词隐式使用-print
:
POSIX强制要求,如果find
命令的表达式作为整体不包含任何一个
-print
本身 -exec
和-ok
find
,但现实世界的实施中,如GNU find
和BSD find
添加其他的,例如,作为输出产生-print0
初级,且执行-execdir
主) 那么隐式应用-print
,就好像该表达式被指定为:
( expression ) -print
这很方便,因为它可以让你编写诸如find .
命令find .
,而无需追加-print
。
但是,在某些情况下,需要显式-print
,如下所示:
假设我们没有在接受的答案末尾指定-print
:
find . -path ./ignored_directory -prune -o -name fileName.txt
由于表达式中不存在输出或执行初级,所以它被评估为:
find . ( -path ./ignored_directory -prune -o -name fileName.txt ) -print
这不会按预期工作,因为如果整个括号表达式的计算结果为true,则会打印路径,在这种情况下,错误地包含修剪后的目录。
相比之下,通过将-print
明确地附加到-o
分支,只有在-o
表达式的右侧计算为true时才会打印路径; 使用括号使逻辑更清晰:
find . -path ./ignored_directory -prune -o ( -name fileName.txt -print )
相反,如果左侧为真,则只执行-prune
,不会产生任何输出(并且由于整个表达式包含-print
, -print
不会隐式应用)。
编辑 (添加行为规范细节)
在find中修剪所有权限被拒绝的目录
使用gnufind。
规范行为细节 - 在这个解决方案中,我们希望:
基本的设计模式是:
find ... ( -readable -o -prune ) ...
例
find /var/log/ ( -readable -o -prune ) -name "*.1"
{感谢} mklement0
链接地址: http://www.djcxy.com/p/78123.html