我正在使用Bash来浏览一些目录和文件。我正在使用示例中所示的find函数,我需要排除所有目录(以及它包含的所有目录)和名称与正则表达式匹配的文件(可以是任何内容)。
while read file
do
do_stuff "${file}"
done <<< "$(find ${SOME_DIR}")
我已经尝试过使用-not -name args但只排除了那个特定目录,并在该目录中进行了全部处理。
顺便说一下。我在这里发现了一些类似的问题,但都非常具体。这个正则表达式可以是任何东西。
示例:REGEX ='^ bbb $'
dir结构: ./test
├──bbb
│└──某些文件
├──-e
├──dir2
│└──bbb
├──a
├──b
└──c
所以在这里我想找到排除bbb目录及其中的所有内容和bbb文件。
另一个正则表达式示例: '^。 b。 $' - 名称中包含b的所有文件和目录
答案 0 :(得分:2)
您有几种选择。最接近您的问题,如果您使用的是GNU find
,那么您可以使用否定的-regex
测试来过滤掉您不想看到的文件。由于这与每个文件的整个路径(相对于其中一个起始目录)匹配,因此您可以编写一个正则表达式,该正则表达式匹配以文件名结尾的路径和具有该名称作为中间目录的路径。例如,
find . -not -regex '\(.*/\)?bbb\(/.*\)?'
(请注意,锚定模式是不必要的,因为只有当模式与所考虑的整个路径匹配时,测试才会成功。)
但更好的方法是使用带有-prune
动作的否定文件名测试,如下所示:
find . -not -name 'bbb' -o \( -prune -false \)
-name
测试将所考虑的每个文件的基本文件名与指定的 shell模式(glob)进行比较,结果由-not
运算符取消。仅当左侧表达式求值为false时,才会评估-o
(逻辑或)运算符的右侧表达式,在这种情况下,它会在最终评估为false之前执行-prune
操作。因此,具有给定名称的文件被抑制(-false
),并且它们的后代(如果有的话)根本不被扫描(因为-prune
)。所有这些都可以移植到任何符合POSIX的find
。