findコマンドの出力を使用して特定のディレクトリを削除します

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/車の画像/在庫/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 {}/thumbnailsthumbnails最後に追加し、結果のディレクトリを削除します

答え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 ループで読み取ってサムネイル ディレクトリを削除します。

関連情報