xargsで引数を引用する方法


15

1 MBを超えるフォルダー内のすべてのファイルを削除するとします。

$ find . -size +1M | xargs -0 rm

これにより、名前にスペースが含まれるファイルは削除されません。だから私はそれが送信するすべての引数を引用したいrm。場合はfind、それを与えるSome report.docxことは渡す必要があります"Some report.docx"rm

どうやってやるの?


1
で 何かを行う前に、このmywiki.wooledge.org/UsingFind?highlight=%28xargs%29をお読みくださいxargs。また、wikiが示唆するようにxargs-print0to を渡さないで使用しないでくださいfind
バレンティンバジラミ14


使用xargs -d$'\n'のみ新しい行に区切り文字を制限する(とないスペース;これはないだろう、特別に引用符などを処理する -私は、GNUシステム上でチェックしました) -で与えられた答えstackoverflow.com/a/33528111/94687を
imz-イヴァンザカリヤシェフ

回答:


13

簡単な使用:

find . -size +1M -delete

xargsrmを使用する場合は、コマンドをfind追加するだけ-print0です:

find . -size +1M -print0 | xargs -r0 rm --

他の方法:

find . -size +1M -execdir rm -- {} +

からman find

-print0
    True; print the full file name on the standard output, followed by a null 
character (instead of the newline character that -print uses). This allows file names 
that contain newlines or other types of white space to be correctly interpreted by 
programs that process the find output. This option corresponds to the -0 option of 
xargs.

2
これで問題は解決しますが、実際には引数を引用することは他の場合に役立ちます。それで、私は他の答えを待ちます。ただし、シンプルなソリューションの場合は+1。
Kshitizシャルマ

2
@KshitizSharmaいいえ、あなたは合格したくない"Some report.docx"rm、ファイル名は引用符が含まれていない限り、。あなたが欲しいのは、Some report.docx痴漢せずに渡すことですrm。KasiyAの答え(現在)は、でそれを行う一般的な方法を示していfindます。[KasiyA:早く間違ったpingでごめんなさい。]
ジル「SO-悪であるのをやめる」14

@Gilles正しい。bashでは、通常、文字列を引用符で囲んで、無傷で渡します。だから私は何を意味するのか引用して代わりに分割アップであることのRMへの単一の引数としてファイル名を送信するためだった$0$1など
Kshitizシャルマ

OSX xargs -0では、代わりにを実行しますxargs -r0
ロルフ

8

のオプション-0xargs、パイプからの出力がヌル終了項目として解釈されることを意味します。そのような場合、を使用してパイプの入力を作成する必要もありますfind ... -print0


5

同様の要件があり、最終的に-Iスイッチを使用してプレースホルダーを作成し、それを引用することができました。

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