Find

查找:名稱中的正則表達式

  • April 2, 2020

假設我寫:

find . -regex "[0-9]{4}-[0-9]{2}-[0-9]{2}-(foo|bar).csv.gz" -printf "%f\n"

這個命令在我看來應該可以工作。我已經遍歷了各種 regextype 選項和各種 regex 格式,但無法通過 find 讓這種 regex 工作。關於 find 和正則表達式解析器,我在這裡有什麼簡單的錯誤嗎?

Find’s-name不採用正則表達式(這在問題的原始版本中使用過)。它需要 shell glob,這不是一個有效的 shell glob。您想使用-regex測試,但還需要告訴它使用擴展的正則表達式或任何其他能夠理解{N}foo|bar符號的風格。最後,與 不同-name的是,-regex測試會查看整個路徑名,因此您需要這樣的內容:

$ find . -regextype posix-extended -regex ".*/[0-9]{4}-[0-9]{2}-[0-9]{2}-(foo|bar).csv.gz" -printf "%f\n"
5678-34-56-bar.csv.gz
1234-12-12-foo.csv.gz

如果你想使用-name,你可以這樣做:

find . \( \
      -name "[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-foo.csv.gz" \
   -o -name "[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-bar.csv.gz" \
      \) -printf "%f\n"

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