我们有代码可以生成大量文件,名称如 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]”更干净的方法?
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启用扩展正则表达式,如 forgrep或sed。