xargs
| 対応: | 全Linux | |
|---|---|---|
| macOS(2001 Cheetah) | ||
| Bash 1.0(1989) |
『xargs』は標準入力から受け取った値をコマンドの引数として渡すコマンドです。パイプと組み合わせることで、ファイル一覧や検索結果を別のコマンドにまとめて渡せます。
構文
標準入力をコマンドの引数として渡します。
コマンド | xargs 実行コマンド
『-I』オプションを付けるとプレースホルダー {} に入力値を挿入します。
コマンド | xargs -I{} 実行コマンド {}
『-n』オプションを付けると一度に渡す引数の数を制限します。
コマンド | xargs -n 個数 実行コマンド
『-P』オプションを付けると並列実行します。
コマンド | xargs -P プロセス数 -I{} 実行コマンド {}
ファイルに空白・改行が含まれていても安全に処理します(-0)。
find . -name "*.txt" -print0 | xargs -0 実行コマンド
オプション一覧
| オプション | 概要 |
|---|---|
| -I{} | 入力値を {} に置換して挿入します(任意の記号も使用可)。 |
| -n 個数 | 1回のコマンド実行に渡す引数の最大数を指定します。 |
| -P 個数 | 並列実行するプロセス数を指定します。 |
| -0 | null 文字を区切りとして読み込みます(find -print0 と組み合わせ)。 |
| -t | 実行するコマンドを表示してから実行します(デバッグ用)。 |
| -p | 実行前に確認プロンプトを表示します。 |
| -r | 入力が空のときコマンドを実行しません(GNU xargs のみ)。 |
| -L 行数 | 指定行数ずつ引数として渡します。 |
サンプルコード
以下のディレクトリ構造を例に説明します。
『find』の結果を『xargs』で別のコマンドに渡します。.log ファイルをすべて削除する例です。
find . -name "*.log" | xargs rm
ファイルパスにスペースや特殊文字が含まれる場合は『-print0』と『-0』を使います。
find . -name "*.log" -print0 | xargs -0 rm
『-I{}』でプレースホルダーを使い、ファイルを1つずつリネームします。
ls *.txt | xargs -I{} mv {} {}.bak
『find』と『grep』を組み合わせて複数ファイルを検索します。
find . -name "*.php" | xargs grep -l "TODO" ./src/index.php ./src/utils.php
『-n N』で一度に渡す引数の数を制限します。
echo "a b c d e f" | xargs -n 2 echo a b c d e f
『-t』で実行するコマンドを表示してから実行します(デバッグに便利です)。
echo "file1 file2 file3" | xargs -t -n 1 echo echo file1 file1 echo file2 file2 echo file3 file3
『-P N』でN並列でファイルを処理します。複数ファイルの圧縮を4並列で実行する例です。
ls *.csv | xargs -P 4 -I{} gzip {}
URLリストを5並列でダウンロードする例です。
cat urls.txt | xargs -P 5 -I{} wget -q {}
よくあるミス
よくあるミス1: スペース入りファイル名が分割されてしまう
xargs はデフォルトで空白文字を区切りとして引数を分割します。スペースを含むファイル名を渡すと予期しない分割が起きます。
find . -name "*.txt" | xargs rm rm: cannot remove './my file.txt': No such file or directory ("my" と "file.txt" に分割されてしまう)
find の -print0 と xargs の -0 を組み合わせて null 文字区切りで処理します。
find . -name "*.txt" -print0 | xargs -0 rm
よくあるミス2: 入力が空のときもコマンドが実行される
xargs はデフォルトで入力が空でもコマンドを1回実行します。rm などのコマンドでは引数なしでエラーになることがあります。
echo -n "" | xargs rm rm: missing operand
GNU xargs の -r オプションを付けると、入力が空のときはコマンドを実行しません。
echo -n "" | xargs -r rm (入力が空なので何も実行されない)
概要
ファイルパスにスペースや特殊文字が含まれる可能性がある場合は、『$ find -print0 | xargs -0』の組み合わせが必須です。null 文字を区切りにすることで任意のファイル名を安全に扱えます。
『-P』オプションによる並列実行はCPUを有効活用できます。複数ファイルの圧縮・変換・ダウンロードなど、独立して処理できるタスクに効果的です。パイプとリダイレクトの詳細は『パイプ(|)』も参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。