ls | grep | rm -- このコマンドのフォーマット方法は?

ls | grep | rm -- このコマンドのフォーマット方法は?

特定のディレクトリにある多数のファイルを削除しようとしています(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

短縮版:

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

lsにパイプしないでくださいxargs。代わりに、このような問題を回避するために、find ... -print0にパイプしてください。xargs -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では、のみ 許可されていない文字それは"ヌル"またはゼロバイト– そういう場合にはこれを使用すべきです。

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

「短縮版」では、単純なシェルワイルドカード(「パターン」)を使用します。bashマニュアル– 「パス名の拡張」セクションを参照してください。

関連情報