
我正在嘗試搜尋包含不同圖像檔案名稱變體的資料夾:
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'