xargs

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動: 案内検索

xargs(エックスアーグズ)はほとんどの UNIXオペレーティングシステムに用意されているコマンドである。標準入力を読み込み、それを引数として指定したコマンドを実行する。

また、xargsは長すぎる標準入力をシステムが受け入れられるサイズに分割してコマンドに渡す。そのため、2.6.23より前のlinuxカーネルにおける、極端に長い引数のリストはコマンドに渡すことが出来ない[1]問題を回避できる。

例えば、以下のようなコマンドは

rm /path/*
rm `find /path -type f` 

/path に多すぎるファイルがあれば「引数リストが長すぎます」というエラーメッセージとともに rm コマンドは失敗する。しかし rm `find /path -type f` と機能的には同等な以下のコマンドは失敗しない。

find /path -type f -print0 | xargs -0 rm

この例では、findxargs への入力としてファイル名の長いリストを出力している。そして、xargs はこのリストをいくつかの部分リストに分割して、それぞれ一回ずつ rm を呼んでいる。上の方法は機能的に同等な以下の方法より効率的である。これはすべてのファイルに対して一回ずつ rm を呼ぶことになる。

find /path -type f -exec rm '{}' \;

しかし、最近の find では xargs を使った方法と同じことができる。

find /path -type f -exec rm '{}' +

xargs はしばしばたくさんのシェルバッククォート機能と同じ機能を持っている。しかし、より柔軟で、入力に空白や特殊文字を含む場合にはしばしばより安全でもある。findlocategrep のような長いリストを出力するコマンドとともによく使われる。

[編集]

find . -name "*.foo" | xargs grep bar

は下と同じように動作する。

grep bar `find . -name "*.foo"`

上のコマンドではシングルクォート (') ではなくバッククォート (`) を使っていることに注意しなければならない。上のコマンドは現在のディレクトリとサブディレクトリ内の.foo で終わっているファイルから文字列 bar を検索する。ファイル名に改行コードを含む空白文字が含まれていた場合、このコマンドは期待した通りには動作しない。この制限を避けるには、ヌル文字を使ってファイル名を分割する find や xargs の GNU 拡張を使って

find . -name "*.foo" -print0 | xargs -0 grep bar

とすればよい。

find . -name "*.foo" -print0 | xargs -0 -t -r vi

も上と同じ検索条件である。しかし、各ファイル名に対して vi を起動する。-t はそれを実行する前に標準エラー出力にコマンドを表示する。-r は入力を受け取らなかったときにコマンドを実行しないということを xargs に伝える GNU 拡張である。

find . -name "*.foo" -print0 | xargs -0 -i mv {} /tmp/trash

では xargs に {} を引数リストに置き換えるということを伝えるために -i を使っている。

参照[編集]

外部リンク[編集]