LinuxLinux [リナックス / ライナックス]オープンソースのOSカーネルのxargsコマンドは、他のコマンドの出力を引数として別のコマンドに渡すために使います。
findやgrepと組み合わせることで、ファイルの一括処理が効率よく行えます。
確認した環境
本記事のコマンドは以下の環境で動作を確認しています。
| 項目 | バージョン |
|---|---|
| OSOS [オーエス]Operating System。基本ソフトウェア | UbuntuUbuntu [ウブントゥ]人気のLinuxディストリビューション 24.04.1 LTS |
| xargs | GNU findutils 4.9.0 |
| Kernel | Linux 5.15.167.4-microsoft-standard-WSL2 |
xargsコマンドとは
xargsは、標準入力から受け取ったデータを、指定したコマンドの引数として渡すコマンドです。
パイプ(|)でコマンドをつなぐとき、xargsを使うことで次のような場面に対応できます。
findで見つけたファイルを一括削除するgrepで絞り込んだファイルに一括で処理を適用する- 大量の引数を分割して安全にコマンドを実行する
基本構文
コマンド | xargs [オプション] [実行するコマンド]パイプの左側のコマンド出力が、xargsを経由して右側のコマンドの引数になります。
基本的な使い方
シンプルな例:echoで引数を確認する
まず動作を確認するため、echoに引数を渡してみます。
echo "file1.txt file2.txt file3.txt" | xargs echofile1.txt file2.txt file3.txtechoの出力がxargsを経由して、次のechoの引数として渡されます。
findと組み合わせた使い方
xargsの最も代表的な使い方が、findコマンドとの組み合わせです。
ファイルを検索して一括削除する
カレントディレクトリ配下の.tmpファイルを検索して一括削除する方法を紹介します。
注意:
rmは元に戻せません。事前にechoで対象ファイルを確認することをおすすめします。削除前の確認(echoで対象ファイルを表示) find . -name "*.tmp" | xargs echo
下記コマンドで、.tmpファイルを検索して削除することができます。
find . -name "*.tmp" | xargs rmファイル名にスペースが含まれる場合
ファイル名にスペースが含まれていると、通常のxargsでは正しく処理できません。
その場合はfindの-print0とxargsの-0オプションを組み合わせます。
-print0なしでスペースを含むファイルを渡すと、スペースで分割されてエラーになります。
find . -name "*.tmp" | xargs lsls: cannot access './dir1/file': No such file or directoryls: cannot access 'with': No such file or directoryls: cannot access 'space.tmp': No such file or directory./dir1/temp1.tmp./dir1/temp2.tmp-print0と-0を組み合わせることで、スペースを含むファイル名も正しく処理できます。
find . -name "*.tmp" -print0 | xargs -0 rm-print0:ファイル名の区切りをNULLnull [ヌル / ナル]値が存在しないことを表す特殊な値文字にする-0:NULL文字を区切りとして受け取る
grepと組み合わせた使い方
特定キーワードを含むファイルを一覧取得して処理する
grep -rlで特定のキーワードを含むファイルを検索し、そのファイルに処理を適用できます。
grep -rl "keyword" ./ | xargs catキーワードを含むファイルを一括置換する
grep -rlとxargs sedを組み合わせて、対象ファイルのみを一括置換できます。
grep -rl "keyword" ./ | xargs sed -i "s/keyword/after_keyword/g"findとsedを組み合わせた一括置換
findで対象ファイルを絞り込み、xargs sedで一括置換する方法もよく使われます。
find ./ -type f -print | xargs sed -i "s/keyword/after_keyword/g"特定の拡張子のみを対象にする場合は、findの-nameオプションを組み合わせます。
find ./ -type f -name "*.txt" -print | xargs sed -i "s/keyword/after_keyword/g"
【Linux】sedで文字列を一括置換する方法
Linuxのsedとfindを使い、複数ファイルの文字列を一括置換する方法を詳しく解説します。grepでの事前確認や、特定のディレクトリ・拡張子を除外する方法も紹介するので、大量のファイルを効率的に編集したい方におすすめです。
並列実行する(-P オプション)
-Pオプションを使うと、コマンドを並列実行できます。大量のファイルを処理する際に高速化できます。
find . -name "*.log" | xargs -P 4 gzip-P 4:最大4プロセスを並列で実行する
1引数ずつ実行する(-I オプション)
-Iオプションを使うと、引数を1つずつ受け取り、コマンド内の任意の位置に挿入できます。
コマンド | xargs -I {} 実行するコマンド {}例:ファイルをバックアップディレクトリにコピーする
find . -name "*.conf" | xargs -I {} cp {} /backup/{}の部分にfindで見つけたファイル名が1つずつ入ります。
引数の数を制限する(-n オプション)
-nオプションを使うと、一度に渡す引数の数を制限できます。
echo "a b c d" | xargs -n 2 echoa bc dechoコマンドに4つの引数が2つずつ分けて渡され、2行で出力されます。
よく使うオプションまとめ
| オプション | 説明 |
|---|---|
-0 | NULL文字を区切り文字として使用(-print0と組み合わせる) |
-I {} | 引数を1つずつ受け取り、{}の位置に挿入する |
-n N | 一度に渡す引数の数をNに制限する |
-P N | 最大Nプロセスを並列実行する |
-t | 実行するコマンドを表示してから実行する(デバッグに便利) |
-p | 各コマンドの実行前に確認プロンプトを表示する |
-t オプションの出力例
-tオプションを使うと、実際に実行されるコマンドを確認できます。動作確認やデバッグに便利です。
find . -name "*.txt" | xargs -t echoecho ./file1.txt ./file2.txt ./file3.txt./file1.txt ./file2.txt ./file3.txt1行目が実行されるコマンド(標準エラー出力)、2行目が実際の出力です。
実用例まとめ
1. .tmpファイルを一括削除する
find . -name "*.tmp" -print0 | xargs -0 rm2. キーワードを含むファイルを一括置換する
grep -rl "old_text" ./ | xargs sed -i "s/old_text/new_text/g"3. .logファイルを並列圧縮する
find /var/log -name "*.log" -print0 | xargs -0 -P 4 gzip4. 検索したファイルを別ディレクトリにコピーする
find . -name "*.conf" -print0 | xargs -0 -I {} cp {} /backup/まとめ
xargsは標準入力のデータをコマンドの引数として渡すコマンドfindと組み合わせてファイルの一括削除・処理ができる- ファイル名にスペースがある場合は
-print0と-0を使う -I {}で引数の挿入位置を指定できる-Pで並列実行して処理を高速化できる
関連コマンド
xargsとよく組み合わせて使うfindコマンドやgrepコマンドの詳しい使い方は以下の記事もご参照ください。

【Linux】再帰的にファイル名を検索する(findコマンド)
Linuxでファイルやディレクトリを検索する際、便利なのがfindコマンドです。本記事では、「再帰的にファイル名を検索する」というテーマに焦点を当てて、findコマンドの使い方やオプションを指定した応用的な使い方を解説します。

【Linux】grepコマンドで再帰的な検索をする方法
Linuxでファイル内容の再帰的な検索をする場合は、grepコマンドのrオプションを利用します。またlオプションと組み合わせることで、該当ファイルの一覧も取得することができます。
以上で本記事の解説を終わります。
よいITライフを!
人気記事
- 1
- 2
- 3
- 4
- 5
一生モノの基礎知識が身につく定番書です。