我有一个名为test
的目录,其中包含01
,02
,... 31
等日期范围内的子文件夹。此所有子文件夹中都包含.bz2文件。我需要使用find命令搜索扩展名为.bz2的所有文件,但不包括特定范围的目录。我知道find . -name ".bz2" -not -path "./01/*"
,但如果我想跳过10个目录,写-not -path "./01/*"
会非常可怜。那么我如何在01..19
命令中跳过find
个子目录?
答案 0 :(得分:5)
您可以在模式中为选项-not -path
使用通配符:
find ./ -type f -name "*.bz2" -not -path "./0*/*" -not -path "./1*/*
这将排除所有以0或1开头的目录。甚至更好:
find ./ -type f -name "*.bz2" -not -path "./[01]*/*"
答案 1 :(得分:3)
首先,您可以使用find
而不是-prune
来帮助-not -path
- 这样可以避免查看相关目录。
关于你的要点 - 你可以为你的例子建立一个通配符(数字01到19):
find . -path './0[1-9]' -prune -o -path './1[0-9]' -prune -o -print
如果您的范围不太方便(例如05到25),您可能希望将范围构建为bash变量,然后将其插入到find
命令中:
a=("-path ./"{05..25}" -prune -o")
find . ${a[*]} -print -prune
(您可能希望echo "${a[*]}"
或printf '%s\n' ${a[*]}
了解它是如何运作的)
答案 2 :(得分:2)
对我来说,我发现 find 命令作为一个独立的工具,有点麻烦。因此,我总是最终使用 find 的组合来进行递归文件搜索和 grep 来制作实际的排除/包含内容。最后,我将结果移交给执行操作的第三个命令,例如 rm 以删除文件。
我的通用命令看起来像这样:
find [root-path] | grep (-v)? -E "cond1|cond2|...|condN" | [action-performing-tool]
例如,您要删除与当前目录中某些条件匹配的所有 文件:
find . -not -name "\." | grep -v -E "cond1|cond2|cond3|...|condN" | xargs rm -rf
正如您所看到的,我们在点所示的当前目录中搜索根路径:然后我们想要反转匹配结果,因为我们希望所有文件不匹配我们的条件:最后我们将找到的所有文件传递给 rm 以删除它们:我将-rf添加到recursive / force删除所有文件。我使用了 -not -name"。" 的find命令来排除当前用点表示的当前目录。
对于实际问题:假设我们有一个使用.git和.metadata目录的目录,我们希望在搜索中排除它们:
find . -not -name "\." | grep -v -E ".git|.metadata" | [action-performing-tool]
希望有所帮助!
答案 3 :(得分:0)
如果您想在父目录下排除子目录,那么这可能会有用:
例如-您具有父目录“ ParentDir”,并且具有两个子目录“ Child1,Child2”。您只想从“ Chiled2”读取文件,而跳过“ Child1”。这样会有所帮助。
find ./ParentDir ! -path "./ParentDir/Child1*" -name *.<extention>