Linux

遞歸查找以指定模式結尾的文件

  • March 9, 2018

我有很多文件以“-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-awkposix-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

引用自:https://unix.stackexchange.com/questions/429200