grep出力をrmに与える


47

grep出力をにパイプしようとしていますがrm、役に立たないものを出力します。スイッチは必要ですrmか?またはrm、正規表現を直接提供できますか?

ls | grep '^\[Daruchini'| rm

rm:オペランドがありません詳細については、「rm --help」を試してください。


常にエラーメッセージをコピーして貼り付けます。(将来の読者のために実際のエラーメッセージを挿入しました。ただし、この場合はエラーメッセージが1つしか存在しないため、これを行うことができました。ほとんどの場合、問題を理解するには正確なエラーメッセージが必要です。 。したがって、常にすべてのエラーメッセージを完全にコピーアンドペーストしてください。)
ジル「SO-悪であるのをやめる」

回答:


57

を使用xargsして、標準入力をの引数に変換する必要がありますrm

$ ls | grep '^Dar' | xargs rm

(ファイル名の特殊文字に注意してください; GNU grepでは、

$ ls | grep -Z '^Dar' | xargs -0 rm

また、シェルは正規表現を使用しませんが、それは単純なパターンです:

$ rm Dar*

(その間、もっと睡眠が必要だと思います。)


2
アスカーを仮定したときに(s)はミスをしなかった彼は、彼が後の質問、(複数可)を投稿rm Dar*、ありませんrm !(Dar*)
ジル 'SO-悪であるのをやめる'

...そうです、私はzsh ^モードで立ち往生しました(basg !事に似ています)。
ギーコサウルス

1
+1すばらしい答えです。少し| tr "\n" "\0"前に追加する必要がありましたxargs。この記事にみる:stackoverflow.com/questions/20307299/...
アダムPlocher

5

の出力を解析しないでくださいls

ここでは、シェルを使用して必要なファイルをフィルター処理するのは非常に簡単です。コマンドDar*ではなく、パターンを展開しているのはシェルであることに注意してくださいrm。シェルによって実行されるパターン展開は、グロビングと呼ばれます。

rm Dar*

より複雑な場合は、findコマンドを調べてください。


3

grep空白ではなく改行で出力を区切る場合はxargs-dオプションを使用してそれを指定できます。

$ ls | grep '^Dar' | xargs -d '\n' rm

この質問で説明されているように)


2

出力を引数として渡すには、xargsに詳しくないので、whileループを使用する傾向があります。

ls | grep '^Dar' | while read line; do rm "$line";done;

これが私の場合に機能した唯一のものです。
マーベル

0

私にとって最高のコマンドは次のとおりです。

find ./Daruchini* -exec rm {}\;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.