目標は、指定された名前のディレクトリを見つけて、その中のすべてのファイルを削除することです。実際のディレクトリは保持されます。
find /home/www/sites/ -iname '_cache' -exec du -hs {} \;
これにより、ファイルのサイズのリストが表示されます
204K /home/www/sites/test.site.com/html/development/Temporary/_cache
904K /home/www/sites/test.site2.com/html/development/Temporary/_cache
Linux の find コマンドで実現することは可能ですか?
答え1
何か試してみたところ、うまくいっているようです。これは Alex がここに投稿した解決策と似ています。
find . -iname '_cache' | xargs -I {} find {} -type f -maxdepth 1 -exec rm {} \;
_cache ディレクトリ内にあるファイルのみを削除します。_cache ディレクトリのサブディレクトリにあるファイルは削除されません。
もちろん、使用する前に試してみて、rm の代わりに ls または無害なものを入力してください。
答え2
このロジックを徹底的にテストしたわけではありませんが、ループ内で次のような操作を実行できます。
for findname in $(find /path/to/search -name '_pattern')
do
find $findname -type f
done
したがって、検索パターンに一致するファイルのリストを取得し、新しい検索で各ファイルをループして、削除するファイルを探します。
記述されている方法ではファイルのリストが得られるので、それをファイルにリダイレクトして、rm でループすることができます。また、for ループ内の find に exec を追加することもできます。ロジックをテストし、一致が適切であることを確認するために、最初に記述どおりに実行することをお勧めします。
答え3
消去するための正しいコマンド
find . -iname '_cache' | xargs -I {} find {} -type f -maxdepth 1 -delete
答え4
find には -delete オプションがあります。これにより、一致したものがすべて削除されます。
マニュアルページより
-消去
Delete files; true if removal succeeded. If the removal failed, an error message is issued. If -delete fails, find's exit stat- us will be nonzero (when it eventually exits). Use of -delete automatically turns on the -depth option. Warnings: Don't forget that the find command line is evaluated as an expression, so putting -delete first will make find try to delete everything below the starting points you specified. When testing a find command line that you later intend to use with -delete, you should explicitly specify -depth in order to avoid later surprises. Because -delete implies -depth, you cannot usefully use -prune and -delete together.