xargsを使用してパラメータを参照する方法

xargsを使用してパラメータを参照する方法

1MBより大きいフォルダ内のすべてのファイルを削除したいとしましょう。

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

名前にスペースが含まれるファイルは削除されません。だから送信されるすべてのパラメータを引用したいと思いますrmfind与えられた場合にSome report.docx渡されるべきです。"Some report.docx"rm

どうすればいいですか?

答え1

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

find . -size +1M | xargs -I {} rm "{}"

答え2

すでに非標準を使用しているため、1M実装でもfindこれをサポートする可能性が高いです-delete。したがって、以下を使用してください。

find . -type f -size +1M -delete

サポートされている場合、これは断然最も安全で効果的です。

xargsand をrm引き続き使用するには、次のコマンドをfind追加します。-print0

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

-print0そして-0非標準ですが一般的です。(何も見つからない場合は実行しないでください-r)はあまり一般的ではありませんが、サポートしていない場合は引数なしで呼び出されるかのように無視できます。)rmfindxargsrm-f

標準構文は次のとおりです。

find . -type f -size +1048576c -exec rm -f -- {} +

別の方法:

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

-exec(これは/より安全で、xargs -0非常に深いディレクトリツリーで動作できます(フルファイルパスが減少するよりも大きくなりますPATH_MAXrm

~からman findGNUシステムでは:

-print0

Trueの場合、標準出力にフルファイル名を印刷し、その後にヌル文字(使用されている改行文字の代わりに-print)が続きます。これにより、出力を処理するプログラムは改行または他の種類のスペースを含むファイル名を正しく解釈できますfind。このオプションは-0オプションに対応しますxargs

答え3

オプションは、パイプの出力がヌルターミネータとして解釈されることを-0意味します。xargsこの場合を使用してパイプへの入力も生成する必要がありますfind ... -print0

答え4

実際に質問に対する既存のコメントを書き直し、答えの下に表示されるようにしました。私の場合は、locate特定の文字列を含むファイル名を見つけるために使用しました。

Ivan Zaharyachevは次のように書いています。xargs -d$'\n'区切り文字を改行(空白ではない)のみに制限するために使用されます。見積もりなどは具体的には扱いません。--GNUシステムを確認しました.) --回答を提供 stackoverflow.com/a/33528111/94687

たとえば、Ivanの提案を使用すると、

$ locate -i example_string | xargs -d$'\n' md5sum

関連情報