从 find 中排除文件和目录。匹配某些正则表达式的函数

Exclude files and directories from find . function that match some regular expression

我正在使用 Bash 浏览一些目录和文件。我正在使用示例中所示的 find 函数,我需要排除所有目录(及其包含的所有内容)和名称与某些正则表达式(可以是任何内容)匹配的文件。

while read file
do 
    do_stuff "${file}" 
done <<< "$(find ${SOME_DIR}")

我已经尝试使用 -not -name args 但它只排除了一个特定目录,并处理了该目录中的所有内容。

顺便说一句。我在这里发现了一些类似的问题,但都很具体。这个正则表达式可以是任何东西。

示例:REGEX='^bbb$'

目录结构: ./测试

├── bbb

│ └── 一些文件

├── -e

├── dir2

│ └── bbb

├── a

├── b

└── c

所以在这里我想排除 bbb 目录及其中的所有内容和 bbb 文件。

另一个正则表达式示例: '^.b.$' -- 名称中包含 b 的所有文件和目录

您有多种选择。最接近您的要求,如果您使用的是 GNU find,那么您可以使用否定的 -regex 测试来过滤掉您不想看到的文件。由于这与每个文件的整个路径(相对于起始目录之一)匹配,因此您可以编写一个正则表达式来匹配以您的文件名结尾的路径和以该名称作为中间目录的路径。例如,

find . -not -regex '\(.*/\)?bbb\(/.*\)?'

(请注意,锚定模式是不必要的,因为只有当模式与考虑中的整个路径匹配时测试才会成功。)

但更好的方法是结合 -prune 操作使用否定文件名测试,如下所示:

find . -not -name 'bbb' -o \( -prune -false \)

-name 测试将考虑的每个文件的基本文件名与指定的 shell 模式 (glob) 进行比较,结果被否定-not 运算符。 -o(逻辑或)运算符的右侧表达式仅在左侧表达式的计算结果为 false 时才进行计算,在这种情况下,它会在最终计算结果为 false 之前执行 -prune 操作。因此,具有给定名称的文件被抑制(-false)并且它们的后代(如果有的话)根本不会被扫描(因为-prune)。所有这些都可以移植到任何符合 POSIX 的 find.