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
はカレントディレクトリ (./
) を処理しないために入れている。