xargs
概要
- あるコマンドの結果をパイプして別のコマンドに渡す際に、引数を制御するコマンド。
- 並列処理もできる。
使い方
基本形
$ COMMAND1 | xargs OPTION COMMAND2
| OPTION | 説明 |
|---|---|
-L | COMMAND2 に与える引数の最大数 (改行までを 1 データとみなす) |
-n | COMMAND2 に与える引数の最大数 (whitespace までを 1 データとみなす) |
-P | COMMAND2 で同時に実行する最大数 (並列処理) |
-I (アイ) | COMMAND2 に与える引数を指定した文字列で指定 (この場合、-L オプションは無視され、引数は 1 つずつ処理される) |
-0 (ゼロ) | COMMAND1 で得られたデータを null 文字で区切られたものとして処理する |
- 例:
seqで生成した 1〜10 の数字を 3 個ずつ改行しながら表示 (echo) する。
$ seq 1 10 | xargs -L 3 echo 1 2 3 4 5 6 7 8 9 10 $ seq -s ' ' 1 10 | xargs -n 3 echo 1 2 3 4 5 6 7 8 9 10
- 2 番目は、数字の間の区切り文字をスペースとして指定していることに注意。
- 例: カレントディレクトリの大量のファイルを別ディレクトリ (
MOVE_TO) に移動させる (通常のmv * MOVE_TOでargument list too longというエラーが出る場合)
$ find . -type f -print0 | xargs -I XXX -0 mv XXX MOVE_TO
mvコマンド内の引数の位置を指定したいため、find で得られたそれぞれのファイルパスは-Iオプションでmvコマンド内のXXXに渡すと指定している (-Iオプションがない場合は、MOVE_TOが指定できない)。
- 例: カレントディレクトリにある複数のディレクトリを zip で圧縮する (ただし、4 CPU で同時に圧縮していく)
$ find . -maxdepth 1 -mindepth 1 -type d -print0 | xargs -0 -P 4 -I XXX zip -r XXX.zip XXX
maxdepthはサブディレクトリを処理しないために入れている。mindepthはカレントディレクトリ (./) を処理しないために入れている。