====== 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'' はカレントディレクトリ (''./'') を処理しないために入れている。
===== 参考サイト =====
* [[https://qiita.com/hitode7456/items/6ba8e2d58f9b8db9de11#-n-%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3 | xargs のオプションいろいろ - Qiita]]
* [[https://stackoverflow.com/questions/41623959/what-is-the-difference-between-l-and-n-in-xargs | what is the difference between -L and -n in xargs - Stack Overflow]]: ''-L'' と ''-n'' オプションの違い
* [[https://utano.jp/entry/2018/08/solution-for-mv-error-argument-list-too-long/ | [Sy] 大量ファイルの移動などで「argument list too long」とエラーになってしまう場合の対処 | Syntax Error.]]
{{tag>Linux コマンド}}