Bash
如何查找兩個不同的名稱
我們的程式碼會生成大量文件,其名稱包括 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 $$“‘?
find "$dir" \( -name stdout -o -name stderr \) -exec ...
或者,使用 GNU
find
:find "$dir" -regextype posix-extended -regex ".*/(stdout|stderr)"
請注意,
-regex
與整個路徑匹配,更像是-path
,-name
並且正則表達式被錨定,就好像^
在開始和$
結束時有一個隱式。另請注意,由於.*
匹配任何字元序列,它不會在路徑無法解碼為語言環境中的字元的目錄中找到stdout
/文件。stderr
$dir
還要注意,如果以謂詞名稱開頭-
或恰好匹配謂詞名稱,它將失敗find
。使用 BSD
find
,您可以:find -E -f "$dir" -- -regex '.*/std(out|err)'
上面,
"$dir"
是作為參數傳遞給選項的,因此以 .開頭的-f
值沒有歧義,也沒有問題。啟用擴展的正則表達式,如 for或.$dir``-``-E``grep``sed