在find命令中排除目录范围

时间:2016-01-29 07:45:03

标签: linux shell find

我有一个名为test的目录,其中包含0102,... 31等日期范围内的子文件夹。此所有子文件夹中都包含.bz2文件。我需要使用find命令搜索扩展名为.bz2的所有文件,但不包括特定范围的目录。我知道find . -name ".bz2" -not -path "./01/*",但如果我想跳过10个目录,写-not -path "./01/*"会非常可怜。那么我如何在01..19命令中跳过find个子目录?

4 个答案:

答案 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] 
  • root-path是以递归方式开始搜索的地方
  • 添加 -v 选项用于反转匹配结果。
  • cond1 - condN,匹配的条件。当-v被调用时,这是匹配的条件。
  • 动作执行工具完成实际工作

例如,您要删除与当前目录中某些条件匹配的所有 文件:

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>