
ディレクトリ ツリー内のすべての *.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
バイナリを起動する回数が大幅に減ったため、より高速なオプションになりました。