我们的代码会生成大量名称为 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
-
-E
grep
sed