xargsコマンド

標準入力から引数を受け取ってコマンドを実行します。

概要

xargsは標準入力からアイテムを読み取り、それらをコマンドの引数として実行します。他のコマンドの出力からコマンドラインを構築したり、大きな引数リストを処理したり、データをバッチで処理したりする場合に特に便利です。

オプション

-0, --null

入力アイテムは空白ではなくnull文字で区切られます。入力にスペースや改行が含まれる可能性がある場合に便利です。

$ find . -name "*.txt" -print0 | xargs -0 grep "pattern"
./file1.txt:pattern found here
./path with spaces/file2.txt:pattern also here

-I, --replace[=R]

初期引数内のR(デフォルトは{})の出現を標準入力から読み取った名前に置き換えます。

$ echo "file1.txt file2.txt" | xargs -I {} cp {} backup/

-n, --max-args=MAX-ARGS

コマンドラインごとに最大MAX-ARGS個の引数を使用します。

$ echo "1 2 3 4" | xargs -n 2 echo
1 2
3 4

-P, --max-procs=MAX-PROCS

最大MAX-PROCSのプロセスを同時に実行します。

$ find . -name "*.jpg" | xargs -P 4 -I {} convert {} {}.png

-d, --delimiter=DELIM

入力アイテムは空白ではなくDELIM文字で区切られます。

$ echo "file1.txt:file2.txt:file3.txt" | xargs -d ":" ls -l
-rw-r--r-- 1 user group 123 May 5 10:00 file1.txt
-rw-r--r-- 1 user group 456 May 5 10:01 file2.txt
-rw-r--r-- 1 user group 789 May 5 10:02 file3.txt

-p, --interactive

各コマンドを実行する前にユーザーに確認を求めます。

$ echo "important_file.txt" | xargs -p rm
rm important_file.txt ?...

使用例

ファイルの検索と削除

$ find . -name "*.tmp" | xargs rm

複数の引数によるバッチ処理

$ cat file_list.txt | xargs -n 3 tar -czf archive.tar.gz

grepと組み合わせて複数のファイルを検索

$ find . -name "*.py" | xargs grep "import requests"
./script1.py:import requests
./utils/http.py:import requests as req

スペースを含むファイル名の処理

$ find . -name "*.jpg" -print0 | xargs -0 -I {} mv {} ./images/

ヒント:

空の入力でのコマンド実行を防止する

xargs --no-run-if-emptyを使用すると、標準入力が空の場合にコマンドが実行されるのを防ぎ、予期しない動作を防止できます。

実行前にコマンドをプレビューする

xargs -tを使用すると、実行前に各コマンドが表示されるため、対話モードを使用せずに何が実行されるかを確認できます。

特殊文字を含むファイル名の処理

スペース、改行、その他の特殊文字を含む可能性のあるファイル名を扱う場合は、常にfindと一緒に-print0を、xargsと一緒に-0を使用してください。

大規模な操作のためのバッチサイズの制限

多数のファイルを処理する場合は、-nを使用してコマンド実行ごとの引数の数を制限し、「引数リストが長すぎる」エラーを回避します。

よくある質問

Q1. パイプでコマンドに送る方法とxargsを使用する方法の違いは何ですか?

A. パイプ(|)は出力を次のコマンドの標準入力として送りますが、xargsは入力をコマンドライン引数に変換します。rmcpなどの多くのコマンドは標準入力ではなく引数を期待しています。

Q2. ファイル名を途中に必要とするコマンドでxargsを使用するにはどうすればよいですか?

A. プレースホルダーと共に-Iオプションを使用します:find . -name "*.txt" | xargs -I {} mv {} {}.bak

Q3. 多数のファイルに対してxargsをより速く実行するにはどうすればよいですか?

A. 複数のプロセスを並行して実行するために-Pオプションを使用します:xargs -P 4は最大4つのプロセスを同時に実行します。

Q4. xargsが時々入力を予期せず分割するのはなぜですか?

A. デフォルトでは、xargsは空白で分割します。異なる区切り文字を指定するには-dを使用するか、null終端の入力には-0を使用してください。

参考文献

https://www.gnu.org/software/findutils/manual/html_node/find_html/xargs-options.html

改訂履歴