當我執行此查找命令:
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 循環中讀取該文件以刪除縮圖目錄。