find
特定の大きなディレクトリツリーのすべてのコアファイルを削除したいと思います。
このために、特定のファイル名パターンを満たすファイルを一致させたいと思います。たとえば、次のようになります。
find . -name 'core*'
file
...しかし、そのようなファイルが見つかったら、そのファイルに対してコマンドを実行して実際にコアダンプであることを確認したいと思います。たとえば、次のようになります。
file --brief --mime <filename> | grep -q 'application/x-coredump'
コマンドが成功したら、ファイルを削除したいと思います。これらすべてをfindで行うことができますか?
file
重要なのは、動作が「ショートカット」であるということです。パターンと一致しない限り、コマンドを実行したくありません。コマンドを実行すると、速度が非常に遅くなるためです。
答え1
find
+bash
方法:
find / -type f -name "*core*" -exec bash -c \
'[[ `file -bi "$0"` =~ application/x-coredump ]] && echo rm "$0"' {} \;
echo
「必須」ファイル名が見つかった場合は、呼び出しを削除してください。
より短い - find
'を使用すると-delete
アクション:
find / -type f -name "*core*" -exec bash -c \
'[[ `file -bi "$0"` =~ application/x-coredump ]]' {} \; -delete
答え2
確かに可能です:
find . -name '*.core' -type f -exec \
sh 'if file -bi "$1" | grep -qw ^application/x-coredump; then printf "%s\n" "$1"; fi' \
sh {} \;
結果が満足のいくものprintf "%s\n"
に変わりますrm -f
。