特定のディレクトリにある多数のファイルを削除しようとしています(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
指示しています。 の場合も同様です。(やなど、他のいくつかのツールにも同様のオプションがあります。)find
xargs -0
sort -z
grep -zZ
「短縮版」では、単純なシェルワイルドカード(「パターン」)を使用します。bash
マニュアル– 「パス名の拡張」セクションを参照してください。