多くの場合、xargs
の代わりにコマンド置換を使用します。たとえば、rm $(ls)
はls | xargs rm
と同じです
それらの違いは何ですか?
違いの1つは、xargs
が現在のシェルで実行されている間にコマンド置換がサブシェルで実行されることだと思いますが、よくわかりません。
違いをリストしてください。
1つの違いは、パイプの代わりにコマンド置換を使用する場合、渡されるデータのサイズはコマンドバッファーのサイズによって制限されるため、場合によっては警告なしで切り捨てられることです。これは、次のコマンドに渡される前に、コマンド出力全体を生成し、メモリに保存する必要があることも意味します。そのため、大きな出力では、必要以上のメモリを使用できます。
最初の方法の別の問題は、出力が空白で分割されるため、スペースを含むファイル名を処理できないことです。 xargs
も空白の問題の影響を受けますが、使用する区切り文字を変更することで修正できます。ちなみにファイル名を適切に処理するには、2番目の例で区切り文字としてヌルバイトを使用する必要があります。
3番目の問題は、グロブが展開されるため、ファイルの名前にアスタリスクまたは疑問符が含まれている場合、予期しない結果が生じることです。
この問題に関する素敵な議論はここにあります: http://mywiki.wooledge.org/ParsingLs
正しい構文は
echo rm *
またはxargsを使用する必要がある場合、
find . -maxdepth 1 -print0 | xargs -0 echo rm
出力が正しいように見えたら、echo
を削除します。