在find命令中排除目录范围

Rah*_*hul 1 linux shell find

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

Tob*_*ght 7

首先,您可以find通过使用-prune而不是-not -path-来提供帮助,这甚至可以避免查看相关目录。

对于您的主要观点 - 您可以为您的示例构建一个通配符(数字 01 到 19):

find . -path './0[1-9]' -prune -o -path './1[0-9]' -prune -o -print
Run Code Online (Sandbox Code Playgroud)

如果您的范围不太方便(例如 05 到 25),您可能希望将范围构建到 bash 变量中,然后将其插入到find命令中:

a=("-path ./"{05..25}" -prune -o")
find . ${a[*]} -print -prune
Run Code Online (Sandbox Code Playgroud)

(你可能想要echo "${a[*]}"printf '%s\n' ${a[*]}想看看它是如何工作的)


Chr*_*aes 6

您可以在模式中使用通配符作为选项-not -path:

find ./ -type f -name "*.bz2" -not -path "./0*/*" -not -path "./1*/*
Run Code Online (Sandbox Code Playgroud)

这将排除所有以0或1开头的目录.甚至更好:

find ./ -type f -name "*.bz2" -not -path "./[01]*/*"
Run Code Online (Sandbox Code Playgroud)