linuxで再帰的に特定の拡張子のファイルのみ削除

特定のディレクトリ内の、指定した拡張子のファイルを再帰的に削除するコマンドをメモとして残しておきます。

基本コマンド

# 例としてディレクトリ内のテキストファイルを再帰的に削除するコマンド
$ find ディレクトリパス -name "*.txt" | xargs rm

意味としてはコマンドのまんまなのですが、一応コマンドの内容を解説しておきます。このコマンドは以下の手順で再帰的に特定の拡張子のファイルを削除しています。

  1. findコマンドでディレクトリ内の特定の拡張子のファイルパスを再帰的に探索
  2. 探索したファイルパスをrmコマンドに渡して削除

ディレクトリ名に拡張子が含まれている場合

上記のコマンドだと(滅多にないと思いますが)、hoge.txtみたいな名前のディレクトリが存在してた場合はファイルの削除は成功するものの、下記のようなエラーが表示されます。

# hoge.txtはディレクトリのため、オプションなしのrmコマンドでは削除に失敗する
$ find hoge -name "*.txt" | xargs rm
rm: cannot remove 'hoge/hoge.txt': Is a directory

この場合はちょっとタイプ数は増えますが、下記コマンドを使いましょう(エラーが気にならないなら別に使わなくてもいいです)。

$ find ディレクトリパス -name "*.txt" -type f | xargs rm

findコマンドのtype -fオプションは、探索するのをファイルのみに制限します。このオプションをつけないとファイルだろうがディレクトリだろうが、一致する名前のものをすべて探索しちゃうので、ディレクトリも削除しようとしてしまい、エラーが出力されるわけです。

コメント