Linux
遞歸查找以指定模式結尾的文件
我有很多文件以“-105x135.jpg”、“-410x410.jpg”等、“780-105x135.jpg”和“candyswing-2-klein-ohrringe-schale-038-135x160.jpg”結尾的文件夾" 例如,我需要查找和刪除,使用線上正則表達式我創建了這個模式:
[0-9]x..[0-9].jpg
,但find . -regex '[0-9]x..[0-9].jpg'
沒有顯示任何結果。
根據
man
頁面,該選項是整個路徑-regex
上的匹配項,即。整個文件名以及整個目錄路徑部分,因此您需要在正則表達式前面加上. 頁面中有幾個明確的範例。.*``man
另外,請記住選項
-regextype
. 預設(man
每頁)是,emacs
但其他選項是posix-awk
、posix-basic
和。把自己打昏。posix-egrep``posix-extended
另一種選擇是使用 bash 的 globstar 選項:
shopt -s globstar
列出:
ls **/*[0-9][0-9][0-9]x[0-9][0-9][0-9].jpg
或刪除:
rm **/*[0-9][0-9][0-9]x[0-9][0-9][0-9].jpg
文件。
上面的 glob 模式與您提供的正則表達式略有不同;正則表達式將允許之後的任何兩個字元
x
,而不是嚴格的數字。換句話說,一個名為:的文件somefile-135xyz9.jpg
將匹配正則表達式,但不匹配上面的 glob。glob 遞歸地 (
**
) 匹配以下文件:
- 從任何東西開始 (
*
)- 有三個數字(三個
[0-9]
)- 其次是
x
- 後跟三個數字
- 其次是
.jpg
這種方法的一個風險是如果/當匹配文件的數量超過命令行參數空間時。在這種情況下,您可以將文件名保存在一個數組中,然後單獨遍歷該數組。
去弄清楚:
files=(**/*[0-9][0-9][0-9]x[0-9][0-9][0-9].jpg) for file in "${files[@]}"; do echo Would: rm -- "$file"; done
去除:
files=(**/*[0-9][0-9][0-9]x[0-9][0-9][0-9].jpg) for file in "${files[@]}"; do rm -- "$file"; done