パイプ、xargs、exec などは必要ありません:
find . -name .svn -delete
編集: 冗談です、明らかに -delete
unlinkat()
を呼び出します ボンネットの下にあるため、 unlink
のように動作します または rmdir
ファイルを含むディレクトリでの操作を拒否します。
あなたが書いたものは、改行で区切られたファイル名 (およびパス) のリストを rm
に送信します 、しかし rm はその入力をどうするかわかりません。コマンド ライン パラメーターのみが必要です。
xargs
通常は改行で区切られた入力を受け取り、それらをコマンドラインに配置するため、 xargs を追加すると、以前のものが機能します:
find . -name .svn | xargs rm -fr
xargs
rm
にできるだけ多くの引数を渡すほど十分にインテリジェントです 受け入れることができるからです。したがって、100 万個のファイルがある場合、rm
を実行する可能性があります。 1,000,000/65,000 回 (シェルがコマンド ラインで 65,002 個の引数を受け入れることができる場合 {65k ファイル + rm の場合は 1 + -fr の場合は 1})。
人々が巧みに指摘したように、以下も機能します:
find . -name .svn -exec rm -rf {} \;
find . -depth -name .svn -exec rm -fr {} \;
find . -type d -name .svn -print0|xargs -0 rm -rf
最初の 2 つの -exec
フォームは両方とも rm
を呼び出します 削除されるフォルダーごとに、つまり、1,000,000 個のフォルダーがある場合、rm
1,000,000回呼び出されます。これは確かに理想的とは言えません。 rm
の新しい実装 +
でコマンドを終了できるようにします rm
であることを示します 可能な限り多くの引数を受け入れます:
find . -name .svn -exec rm -rf {} +
find/xargs の最後のバージョンでは print0 を使用しているため、find は \0
を使用する出力を生成します。 改行ではなくターミネータとして。 POSIX システムでは \0
以外の任意の文字が許可されるため これは、引数が正しく rm
に渡されることを確認する最も安全な方法です。 または実行中のアプリケーション。
さらに、-execdir
があります。 rm
を実行します ベースディレクトリではなく、ファイルが見つかったディレクトリから -depth
深さを最初に開始します。
これを試してください:
find . -name .svn -exec rm -rf '{}' \;
そのようなコマンドを実行する前に、これを最初に実行することがよくあります:
find . -name .svn -exec ls '{}' \;