使用 find 指令的輸出來刪除特定目錄

使用 find 指令的輸出來刪除特定目錄

當我執行此查找命令:

find /html/car_images/inventory/ -type f -iname \*.jpg -mtime -4

我得到這樣的輸出:

/html/car_images/inventory/16031/16031_06.jpg
/html/car_images/inventory/16117/16117_01.jpg
/html/car_images/inventory/16126/16126_01.jpg
/html/car_images/inventory/16115/16115_01.jpg
/html/car_images/inventory/16128/16128_02.jpg
/html/car_images/inventory/16128/16128_03.jpg
/html/car_images/inventory/16128/16128_04.jpg

我的目標是刪除每個目錄中存在的“縮圖”資料夾(即刪除此資料夾: /html/car_images/inventory/16128/thumbnails/ 並且還刪除/html/car_images/inventory/16115/縮圖/

我正在考慮一個腳本,它獲取上面 find 命令的每一行輸出,然後替換“*.jpg”與“縮圖”並添加作為前綴“rm -fr”,這樣我最終會得到以下結果:

rm -fr /var/www/html/car_images/inventory/16115/thumbnails/
rm -fr /var/www/html/car_images/inventory/16128/thumbnails/

等等...

關於如何做到這一點有什麼想法嗎? (也許使用 find 和 sed 或 cut 的 -exec 選項?)

(表達我整個目標的另一種方式是,如果一個資料夾包含一個比 X 天「年輕」的 .jpg 文件,則刪除其資料夾中的「thumbnails」資料夾)

答案1

假設您的檔案名稱沒有換行符號:

find /html/car_images/inventory/ -type f -iname \*.jpg -mtime -4 \
     -exec sh -c 'echo "${1%/*}"' _ {} \; | sort -u | \
          xargs -d $'\n' -I{} rm -r {}/thumbnails
  • 參數擴展,${1%/*}從每個找到的條目中提取沒有檔案名稱的部分

  • sort -u排序,然後使條目唯一,這樣我們就不會出現任何重複的條目

  • xargs -I{} rm -r {}/thumbnails新增thumbnails到最後,然後刪除生成的目錄

答案2

while read dir;
  do
    rm -r "$dir"/thumbnails;
done < <(while read file; do dirname "$file"; done < <(find /html/car_images/inventory/ -type f -iname \*.jpg -mtime -4) | sort -u)

這是使用進程替換內的進程替換來完成的。

它根據 OP 標準查找文件,在 while 循環中獲取每個 jpg 文件的目錄名,排序並刪除重複項(受 @heemayl 啟發),然後在 while 循環中讀取該文件以刪除縮圖目錄。

相關內容