2011-01-03 17 views
4

なぜ、再帰的にすべての.svnフォルダなぜ|見つけるとうまくいかない?

find . -name ".svn" | rm -rfv 

を削除することを目指し、次のコマンドは動作しませんでしょうか?

私はfindコマンドがこの問題を解決するために-execオプションを提供していることを知っていますが、何が起こっているのかを理解したいだけです。

答えて

12

たとえば、findの結果はrmのSTDINに渡されます。しかしrmはその引数をSTDINで期待していません。

Hereは、入力リダイレクトがどのように機能するかの例です。

+0

最後に!誰かが実際に質問に答えます! –

+0

それぞれの返信がその理由に答えますが、一部は少しわかりにくいです。 – reinierpost

1

rmが標準入力ストリーム上のファイル名のリストを受け入れないため、これは機能しません。

ただ、参考のために、スペースが含まれている可能性があるディレクトリの場合にこれを処理する最も安全な方法は次のとおりです。

find . -name .svn -exec rm -frv {} \; 

それとも、あなたはスピードのために撮影している場合:あなたは

find . -name .svn -print0 | xargs -0 rm -frv 
+1

そして、あなたは質問の**残り**読む場合:*「私は 'find'コマンドは、この問題を解決するために、' -exec'オプションを提供して知っているが、私はちょうどであるかを理解したいとそこで起きている "。 **編集**:さて、あなたはそれを処理するのに十分な編集をしました。 –

+1

'-exec rm -frv {} +'がプロセスが最も少ないので、(テストなしで) '-exec rm -frv {} +'が最速であると期待します。 –

2

rm標準入力からファイル名を読み込まないため、パイプされたデータはすべて無視されます。

標準入力を使用する唯一の方法は、端末であるかどうかを確認することで、プロンプトを出すかどうかを判断できます。

1

find do works with | (例:find ~ -name .svn | grep "a")が問題です。rm

+0

正確に。これは、 'grep' *がSTDINからの入力を期待しているのに対し、' rm'はパイプされたものを無視してパラメータを必要とするからです。 –

関連する問題