2010-12-06 12 views
3

私は単純なことをしたいだけです。私は、ディレクトリ内の以下のファイルを得た:rmは私がここで期待どおりに動作しないのはなぜですか?

AppInterface.h baa PEMsg.h PluginInterface.h 

その後、私はコマンドを発行します。baaは削除されません、私の失望に

多く
ls | grep -v ".h" | rm -rf 

を。しかし、これは:

ls | grep -v ".h" 

は、私が期待している通りです。ですから、問題はrmが入力をどのように受け取るのかということですが、理由はわかりません。 cshとbashの両方でこれを試してみました。

答えて

8

RMファイルのリストをパイプでパイプすることはできません。あなたは

rm `ls | grep -v ".h"` 

または

ls | grep -v ".h" | xargs rm -rf 
+0

ここから 'rm'は何を入力しますか?そしてその違いはなぜですか? – nakiya

+2

Rmは削除するファイルのリストをコマンドラインからのみ取得します。バッククォート ''バージョンはlsとgrepを実行し、rmのコマンドラインで出力を置き換えます。 xargsはstdinからの入力を受け取り、コマンドライン引数として入力を使ってコマンド(この場合はrm -rf)を呼び出します。 xargsは対処する入力が多い場合や、コマンドに渡される前に入力に複雑な処理が必要な場合に優れています。 –

+1

他に何もない場合は、読みやすいようにバッククォートの代わりに '$(...)'を使用する必要があります。 – Sorpigal

4

あなたはxargsを使用したい:

ls | grep -v ".h" | xargs rm -rf 
1

rmは、標準入力から引数を取りません。あなたは、おそらく探している、1つのコマンドの結果は、他の引数の中に挿入することができます(ここではバッククォートで表示)コマンド置換、次のとおりです。あなたのように、標準入力から入力を取らない

rm -rf `ls | grep -v ".h"` 
2

rmが必要

は、それが働いていない理由である、標準入力からファイルのリストを読み取ることはありません。ファイル名のリストをrmにパイプすることはできません。

これを行うための正しい方法は、汎用性の高いfindユーティリティを使用して

find . -maxdepth 1 -not -name '*.h' -exec rm -rf {} + 

だろう。これが多くの仕事のように思えるならば、それは正当な価格です。しかし、実際には、あなたが一度見つけたら、それほど悪くはありません。

+0

findはdefです。これを行う方法は、特にあなたがトラブルに遭遇することなく簡単に出力を確認することができます。 – LordT

+0

「正しい方法」が完全に正確であるかどうかはわかりません。それは単にいくつかの方法の1つです。 –

+1

私は確信しています。ファイル名にスペース文字が含まれていると、他のオプションはすべて失敗します。この方法はそうではないので、正しい方法でなければなりません。この命の恩人に大きな感謝! – Paul

関連する問題