この 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/車の画像/在庫/16128/サムネイル/ また削除する/html/車の画像/在庫/16115/サムネイル/
私はおそらく、上記のfindコマンドからの出力の各行を取得し、"*.jpg「thumbnails」に「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 ファイルが含まれている場合は、そのフォルダー内の「サムネイル」フォルダーを削除するということです)
答え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 ファイルの dirname を取得し、重複を並べ替えて削除し (@heemayl に触発されて)、それを while ループで読み取ってサムネイル ディレクトリを削除します。