xargs
xargs(エックスアーグズ)は、UNIX 系オペレーティングシステムに用意されているコマンドで、標準入力を読み込み、それを引数として指定したコマンドを実行する。
概要[編集]
xargsは、改行等で区切られた標準入力を読み込み、空白で区切られた1行の文字列へ加工し、それを引数として指定したコマンドへ渡して実行させる。
$ seq 8 | xargs echo '-' - 1 2 3 4 5 6 7 8
ただし、この1行の文字列がシステムで許容される長さを超える場合は、xargsはその文字列を許容の長さになるよう最少の複数に分割し、コマンドを複数回に分けて実行させる。これにより、コマンドが許容の長さを超える引数のリストを受け付けない問題[1]を回避できる。
例えば、以下のようなコマンドは
rm /path/* rm `find /path -type f`
/path に多すぎるファイルがあれば「引数リストが長すぎます」というエラーメッセージとともに rm コマンドは失敗する。しかし rm `find /path -type f` と機能的には同等な以下のコマンドは失敗しない。
find /path -type f -print0 | xargs -0 rm
この例では、find は xargs への入力としてファイル名の長いリストを出力している。そして、xargs はこのリストをいくつかの部分リストに分割して、それぞれ一回ずつ rm を呼んでいる。上の方法は機能的に同等な以下の方法より効率的である。これはすべてのファイルに対して一回ずつ rm を呼ぶことになる。
find /path -type f -exec rm '{}' \;
しかし、最近の find では xargs を使った方法と同じことができる。
find /path -type f -exec rm '{}' +
xargs はしばしばたくさんのシェルのバッククォート機能と同じ機能を持っている。しかし、より柔軟で、入力に空白や特殊文字を含む場合にはしばしばより安全でもある。find、locate や grep のような長いリストを出力するコマンドとともによく使われる。
動作例[編集]
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 を使っている。ただし、この {} は一個の引数に置き換えられ、*.foo にマッチするファイル一つ一つに対して mv コマンドが実行されるので、効率的とはいえない。
脚注[編集]
関連項目[編集]
外部リンク[編集]
- Manpage of XARGS GNU 版。JM Project
- xargs(1) man page(SunOS リファレンスマニュアル)