如何查找两个不同的名称

如何查找两个不同的名称

我们的代码会生成大量名称为 stdout、stdout.qsub、stderr、stderr.foo 等的文件。

我想要做

find <dir> -name (stdout|stderr) -exec ...

并且只找到stdout和stderr文件,没有stdout.qsub等。

所以我不能做'-name“std*”'。在这种情况下,我可以执行 '-name "std[eo][ru][rt]"',它会起作用,因为该搜索不会找到任何 stdeut 文件。

有没有比 '-name "std[eo][ru][rt]"' 更干净的方法?

答案1

find "$dir" \( -name stdout -o -name stderr \) -exec ...

或者,使用 GNU find

find "$dir" -regextype posix-extended -regex ".*/(stdout|stderr)" 

请注意,-regex与整个路径匹配,更像-path是,并且正则表达式被锚定,就好像在开头和结尾处-name存在隐式一样。另请注意,since匹配任何序列^$.*人物,它不会在其路径无法解码为语言环境中的字符的目录中找到stdout/文件。stderr

$dir另请注意,如果以谓词名称开头-或恰好与谓词名称匹配,则会失败find

使用 BSD find,您可以执行以下操作:

find -E -f "$dir" -- -regex '.*/std(out|err)'

上面,"$dir"被作为参数传递给选项,因此以开头-f的值没有歧义,也没有问题。启用扩展正则表达式,例如 for或。$dir--Egrepsed

相关内容