尋找:名稱中的正規表示式

尋找:名稱中的正規表示式

假設我寫:

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

在我看來,這個命令應該有效。我已經迭代了各種正則表達式類型選項和各種正則表達式格式,但無法讓這種正則表達式通過查找來工作。關於 find 和正規表示式解析器,我在這裡犯了一些簡單的錯誤嗎?

答案1

尋找-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"

答案2

另一個選擇是fd工具:

fd '[0-9]{4}-[0-9]{2}-[0-9]{2}-(foo|bar).csv.gz'

https://github.com/sharkdp/fd

答案3

如果您有合理的檔案名稱(至少在這個資料夾中),您可以執行以下命令

 find . | grep -E '[0-9]{4}-[0-9]{2}-[0-9]{2}-(foo|bar).csv.gz'

這樣您就可以從各種 grep 選項中受益。

相關內容