【问题标题】:Exclude files and directories from find . function that match some regular expression从 find 中排除文件和目录。匹配某个正则表达式的函数
【发布时间】:2017-08-09 04:14:10
【问题描述】:

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

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

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

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

示例:正则表达式='^bbb$'

目录结构: ./测试

├── bbb

│   └── 一些文件

├── -e

├── dir2

│   └── bbb

├──一个

├── b

└── c

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

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

【问题讨论】:

  • 请添加示例,显示示例目录结构,是否嵌套,添加示例文件名并说明需要哪些文件,哪些不需要
  • @Sundeep 添加示例
  • 我并不是说你需要自己绘制结构......无论如何,所以在所示示例中,你想排除任何名为 bbb.. 的文件/目录。这很清楚......什么关于bbb目录下的some file,那也应该排除?
  • 是的,目录包含的所有内容,some file

标签: bash shell ksh dash-shell


【解决方案1】:

您有多种选择。最接近您的要求,如果您使用的是 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

【讨论】:

  • 很好,为了澄清 OP 的一些要点,你能提到指定的 -name 是 glob 而不是正则表达式吗?可能还有一个带有-regex 选项的示例,该选项具有语法差异和匹配路径的要求等
  • 所以如果我用-regex 替换-name,它应该可以工作吗?
  • 对于答案的第一部分:所以我应该以某种方式使用正则表达式以使其匹配整个路径?如果是这样,有没有简单的方法?
  • @Zeusko 请参阅 stackoverflow.com/questions/6844785/… 以获取 -regex 的示例
  • @Sundeep,感谢您的建议。我已经实现了它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-30
  • 2022-12-11
  • 1970-01-01
  • 2017-05-09
  • 1970-01-01
  • 2011-10-12
相关资源
最近更新 更多