ディレクトリツリー内のすべての *.foo を削除します

ディレクトリツリー内のすべての *.foo を削除します

ディレクトリ ツリー内のすべての *.foo を削除するにはどうすればよいですか?

rm -r *.foo

動作しません。

ループを試すこともできますが、再帰的な展開が必要です。

for x in */*/.../*.foo
    do rm $x
done

これも不可能です。

答え1

以下を使用できますfind:

find -name '*.foo' -delete

答え2

比較的新しいバージョンの bash をお持ちであると仮定します。

shopt -s globstar
rm -- **/*.foo

答え3

find を使ってみることもできます:

find /dir/path -name *.foo -exec rm -f {} \;

答え4

最も簡単な解決策の 1 つは、次のパラメータを指定して find コマンドを使用することですexec

find /path/where/to/start/search -type f -name "*.foo" -exec rm {} \;

これは、*.foo という名前のすべてのファイルを検索し、それぞれに対して rm {filename} を実行します。

ファイルが多数ある場合は、次のxargsコマンドを使用する方が高速になる場合があります。

find /path/where/to/start/search -type f -name "*.foo" | xargs rm 

これにより、すべてのファイルが検索され、ディストリビューション/シェルがサポートするコマンドの最大長までファイル名が rm コマンドの後ろに付けられます。実行すると、次のようになります。

rm dir1/file1.foo dir1/file2.foo dir1/file3.foo 

ご想像のとおり、rmバイナリを起動する回数が大幅に減ったため、より高速なオプションになりました。

関連情報