ls | grep | rm —このコマンドをフォーマットする方法は?


11

特定のディレクトリ内の一連のファイルを削除しようとしています(Mac OS Xでターミナルを使用)

ls | grep \([1-9]\) | xargs rm

トリックをする必要がありますが、それはしません。ファイル名の括弧内の1桁のファイル(Webからダウンロードした重複)を削除しようとしていますが、最終的には次のようになります。

> rm: 520syllabus2010: No such file or
> directory rm: (3).pdf: No such file or
> directory

スペースが正しく解釈されないためです。「520syllabus2010(3).pdf」を削除する必要があります

これを行う適切な方法は何ですか?

ありがとう、ジェフ


1
サンプルのファイル名にリテラルが含まれていません#
ベンジャミンバニエ

1
@honk:彼はリテラルを探していません#
Ignacio Vazquez-Abrams

1
シェルによる拡張のため、cwdにegという名前のファイルがある場合、これは期待どおりに機能しません(3)。シェルが引数に影響を与えないように、引数を引用するのが最善です。
Ignacio Vazquez-Abrams、

1
あなたは、セパレータの問題によって打撃を受けているen.wikipedia.org/wiki/Xargs#The_separator_problem
オレ丹下

回答:


19

短縮版:

rm *\([1-9]\)*

パイプにしないでくださいlsxargs。そのような問題を回避するためfind ... -print0xargs -0、代わりににパイプしてください。

find . -maxdepth 1 -name '*([1-9])*' -print0 | xargs -0 rm

...次のように記述できます。

find . -maxdepth 1 -name '*([1-9])*' -exec rm {} \;

そして:

find . -maxdepth 1 -name '*([1-9])*' -delete

rmワイルドカードを使用してさらに短縮できます。


通常、lsおよびfind改行を持つ別のファイル名が、xargs改行することによって、その入力を分割またはあなたが見る行動で、その結果、スペース。

xargs改行のみで分割するように指示することできますが、ファイルの名前にも改行を含めることができます。実際、LinuxおよびBSDでは、許可されていない文字「null」またはゼロバイトのみ です。したがって、このような場合に使用する必要があります。

上記の例2では、ファイル名をヌルバイトで区切るように-print0指示findしています。同じですxargs -0。(他のいくつかのツールにも、sort -zまたはなどの同様のオプションがありますgrep -zZ。)

「ショートバージョン」では、単純なシェルワイルドカード(bashマニュアルの「パターン」–「パス名の展開」のセクションを参照)を使用します。


1
また、安全の*" "\\([1-9]\\).*ために、(公平に言うと)期間の前に括弧で囲まれた番号の前にスペースがあるファイルのみが削除されるように使用することをお勧めします。
Ignacio Vazquez-Abrams

この構文にはあまり馴染みがありませんが、賛成票に基づいて試してみましたが、何を知っていますか... ありがとう!
ジェフ

1
+1。-print0は、xargsへの正しいパイピングに不可欠です。
クリスW.レア2011年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.