我习惯find "/home/../.." -type f -not -path "*/FolderName/*"
忽略
文件夹名称从被列入。然而,我读到find
仍然遍历这个文件夹名称。使用上面的命令搜索此文件夹中的文件没有列出任何文件,因此我不确定该文件夹是否仍在遍历。-prune
据说确实忽略了被遍历的文件夹,但我不确定是否-prune
真的需要?
答案1
(-depth
并-delete
暗示-depth
)、-prune
、-maxdepth <n>
、-depth [+-]<n>
、-follow
(现在替换为-L
选项)、-quit
、-exit
、-xdev
/-mount
谓词(并非所有实现都支持所有这些)是唯一影响目录遍历的谓词。
在这里,而不是
... ! -path '*/whatever/*' ...
你可以做:
... \( ! -name whatever -o -prune \) ...
或者如果你还想排除whatever
它自己(但这! -path '*/whatever/*'
并不行):
... -name whatever -prune -o \( ... \)
那些必须插入前谓词如-type f
.
这也避免了在某些语言环境和某些实现(如大多数常见语言环境中的*
GNU)中不转换为字符的字节序列不匹配的问题。find
所以对于你的例子:
find "/home/../.." \( ! -name FolderName -o -prune \) -type f -print
或者:
find "/home/../.." -name FolderName -prune -o \( -type f -print \)
(请注意,它排除了所有名为的文件FolderName
,甚至那些不是类型的文件目录)。
答案2
是的。
find
将输入并遍历给定路径下的所有内容,即使该路径已使用-not -path
或过滤掉! -path
。
这是因为-path
谓词不会影响遍历find
。它仅影响对找到的路径名的过滤。
要阻止find
下降到特定路径,请-prune
改为使用。