Find
為什麼 find -regex 在不同機器上的工作方式不同?
所以我得到了以下
find
命令:find ./test-folder -type d -mindepth 1 -regex "^.*/\d\{4\}-\d\{2\}-\d\{2\}$"
以前我已經創建了文件夾
./testfolder
,mkdir testfolder
並在其中創建了一個文件夾mkdir ./testfolder/2022-10-12
。在基於 alpine 的 docker 容器中使用 Bash執行
find
命令時,一切正常並輸出/path/to/testfolder/2022-10-12
如果我在 Lubuntu 機器上的 bash 中執行相同的命令,它不會輸出任何內容。
我沒有修改 find 命令或它周圍的任何東西,我希望它可以在任何機器上工作,但正則表達式似乎表現不同。匹配
*
有效,也匹配無限數量的數字\d*
有效,但是一旦我嘗試匹配-
或使用量詞,{4}
它就不再匹配任何東西。這裡可能是什麼問題?此外,我怎樣才能讓它在 LUbuntu 上執行?
從評論中我推斷出實際的問題是“我如何匹配
\d{4}-\d{2}-\d{2}
LUbuntu 上的等價物”。問題有兩個方面:
- 首先,正如在為什麼 Alpine 上的“查找”命令似乎需要轉義“?”中所解釋的那樣。但不在 Ubuntu 上?,AlpineLinux 和 LUbuntu 上的預設 RegEx 語法是不同的。
- 其次,
\d
字元類是基本正則表達式的“PCRE”樣式擴展find
的一部分,Lubuntu 附帶的GNU 不支持。因此,您應該使用該
-regextype
選項明確選擇具有所需功能的 RegEx 類型,然後堅持該風格。在您的情況下,您可以使用擴展正則表達式:find ./testfolder/ -mindepth 1 -regextype "egrep" -regex '^.*/[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}$'