Bash

如何查找兩個不同的名稱

  • September 3, 2021

我們的程式碼會生成大量文件,其名稱包括 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

引用自:https://unix.stackexchange.com/questions/667511