在 macOS 終端機中使用 find 和正規表示式

在 macOS 終端機中使用 find 和正規表示式

我正在嘗試搜尋包含不同圖像檔案名稱變體的資料夾:

1_2-300x224.jpg
1_2-600x449.jpg
1_2-600x600.jpg
1_2-768x575.jpg
1_2-802x600.jpg
1_2.jpg

計劃是尋找並刪除以 2-4 位數字 + 'x' + 2-4 位數字結尾的檔案。我可以創建這場比賽正規表示式使用表達式.*(\d{2,4}x\d{2,4}).jpg(該表達式突出顯示除 之外的所有內容1_2.jpg)。

但是,運行find . -name ".*(\d{2,4}x\d{2,4}).jpg"不會傳回任何結果。

我很困惑!

答案1

這裡有幾個問題。首先,正如 John 所提到的,-name使用 glob 進行子字串匹配,您需要使用-regex,其次,存在正則表達式方言不相容。預設情況下,GNU find 使用 Emacs 正規表示式,BSD find 使用 posix-basic 正規表示式。如果您已find.info安裝,可以在此處閱讀有關它的更多資訊:

info find.info 'Reference' 'Regular Expressions' 'emacs regular expression'

可以在此處找到支援的正規表示式方言:

info find.info 'Reference' 'Regular Expressions'

這裡:

* findutils-default regular expression syntax::
* emacs regular expression syntax::
* gnu-awk regular expression syntax::
* grep regular expression syntax::
* posix-awk regular expression syntax::
* awk regular expression syntax::
* posix-basic regular expression syntax::
* posix-egrep regular expression syntax::
* egrep regular expression syntax::
* posix-extended regular expression syntax::

GNU 查找

posix-extended您可以使用 GNU find 使您的表達式像這樣工作:

find . -regextype posix-extended -regex '.*[0-9]{2,4}x[0-9]{2,4}.jpg'

輸出:

./1_2-600x600.jpg
./1_2-802x600.jpg
./1_2-600x449.jpg
./1_2-300x224.jpg
./1_2-768x575.jpg

BSD 查找

我無法訪問 BSD find,但我認為這應該可行:

find -E . -regex '.*[0-9]{2,4}x[0-9]{2,4}\.jpg'

相關內容