如何查找两个不同的名称

Gre*_*rty 1 ls bash find

我们有代码可以生成大量文件,名称如 stdout、stdout.qsub、stderr、stderr.foo 等。

我想要做

find <dir> -name (stdout|stderr) -exec ...
Run Code Online (Sandbox Code Playgroud)

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

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

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

ilk*_*chu 5

find "$dir" \( -name stdout -o -name stderr \) -exec ...
Run Code Online (Sandbox Code Playgroud)

或者,使用 GNU find

find "$dir" -regextype posix-extended -regex ".*/(stdout|stderr)" 
Run Code Online (Sandbox Code Playgroud)

只是注意,-regex对整个路径的比赛,更像是-path不是-name又仿佛有一个隐含的正则表达式锚定^在开始和$结尾。还要注意,由于.*匹配任何字符序列,它不会在路径不能被解码为语言环境中的字符的目录中找到stdout/stderr文件。

还要注意,如果$dir以谓词-的名称开头或恰好与find谓词的名称匹配,它将失败。

使用 BSD find,您可以:

find -E -f "$dir" -- -regex '.*/std(out|err)'
Run Code Online (Sandbox Code Playgroud)

上面, the"$dir"作为参数传递给-f选项,所以没有歧义,也没有以$dir开头的值的问题--E启用扩展正则表达式,如 forgrepsed