使用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