「コマンドの引数にファイル一覧を渡したいけど、数が多すぎてエラーになる」
xargsは、標準入力から受け取ったデータをコマンドの引数として渡すコマンドです。findやgrepの出力をそのまま別のコマンドに引き渡せるため、ファイルの一括処理やログの一括検索など、日常的なサーバー管理作業を大幅に効率化できます。
この記事では、xargsの基本的な使い方から、スペースを含むファイル名の安全な処理、並列実行、find -execとの使い分けまで、実務で必要な知識を網羅します。
・xargsは標準入力の内容を別コマンドの引数に変換して実行する仕組み
・find -print0 と xargs -0 の組み合わせでスペースを含むファイル名も安全に処理できる
・-P オプションで並列実行し、大量ファイルの処理を高速化できる
・find -exec \; / -exec + / xargsの使い分けを把握しておくと現場で迷わない
・--no-run-if-emptyや-pを活用して本番環境でも安全に実行できる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
なぜxargsが必要なのか?~パイプだけでは解決できない場面~
Linuxでは、コマンドの出力をパイプ(|)で次のコマンドに渡すのが日常的です。しかし、パイプが渡すのは「標準入力」であって「引数」ではありません。この違いが問題になる典型例を見てみましょう。
# これは動かない(rmは標準入力を受け付けない) find /tmp -name "*.log" | rm # xargsを使えば、findの出力をrmの「引数」として渡せる find /tmp -name "*.log" | xargs rm
xargsは、この「標準入力 → 引数」の変換を担うコマンドです。
動作環境:RHEL 9.4 / Ubuntu 24.04 LTSで動作確認済み。xargsはfindutilsパッケージに含まれており、標準でインストールされています。
基本的な使い方
1. echo でドライラン(実行前の確認)
実際に削除や変更を行う前に、xargsが引数をどう展開するか確認しておくのが安全です。rm の代わりに echo を使うと、実行されるコマンドを表示するだけで何も変更しません。$ find /var/log -name "*.log" -mtime +30 | xargs echo /var/log/audit/audit.log.3 /var/log/audit/audit.log.4 /var/log/maillog.2
2. find | xargs の基本パターン
最も使用頻度が高いのが、findの出力をxargsで別のコマンドに渡すパターンです。# /var/log 配下の .log ファイルを一覧表示 find /var/log -name "*.log" | xargs ls -l # 30日以上前の .log ファイルを削除(-v で削除ログを表示) find /tmp -type f -mtime +30 | xargs rm -fv removed '/tmp/sess_a3f2b.log' removed '/tmp/sess_c9d1e.log'
3. -I{} でプレースホルダを指定する
デフォルトのxargsは、引数をコマンドの末尾に追加します。引数を任意の位置に挿入したい場合は -I{} を使います。# ファイルをバックアップディレクトリにコピー find /etc -name "*.conf" | xargs -I{} cp {} /backup/ # 動作確認(echoで展開を確認してから本番実行) find /tmp -name "*.bak" | xargs -I{} echo mv {} /archive/ mv /tmp/config.bak /archive/ mv /tmp/data.bak /archive/
4. -print0 と -0 でスペースを含むファイル名を安全に処理する
xargsの最大の落とし穴は、スペースを含むファイル名の扱いです。デフォルトではスペースが区切り文字として解釈されるため、「my file.txt」が「my」と「file.txt」の2つに分割されてしまいます。# 安全な書き方(NULL文字で区切る) $ find /home -name "*.txt" -print0 | xargs -0 ls -lh -rw-r--r-- 1 tomohiro tomohiro 4.2K 4月 1 10:00 '/home/tomohiro/docs/meeting notes 2025.txt' -rw-r--r-- 1 tomohiro tomohiro 1.8K 3月 15 09:30 '/home/tomohiro/docs/report draft.txt' # NG(スペースを含むファイル名が分割される) find /home -name "*.txt" | xargs rm -f
※ 本番環境でfind | xargsを使う場合は、常に -print0 | xargs -0 の組み合わせを使うのが鉄則です。
5. echo や cat からの入力
findだけでなく、echoやcatの出力もxargsに渡せます。# スペース区切りの文字列を1つずつ処理 echo "server1 server2 server3" | xargs -n 1 ping -c 1 # ファイルに書かれたホスト一覧に対してコマンドを実行 cat hosts.txt | xargs -I{} ssh {} "uptime"
6. -n で引数の個数を制限する
-n オプションで、1回のコマンド実行に渡す引数の数を制限できます。# 引数を2個ずつに分割して実行 $ echo "a b c d e f" | xargs -n 2 echo a b c d e f
findとの連携(最もよく使うパターン)
1. 古いログファイルをまとめて削除する
find コマンドの -mtime オプションで変更日時を条件にしたファイルを xargs で削除する構成は、サーバー運用で頻繁に使います。# 30日以上更新されていない.logファイルを削除 $ find /var/log/myapp -name "*.log" -mtime +30 -print0 | xargs -0 rm -v removed '/var/log/myapp/app.2025-02-01.log' removed '/var/log/myapp/app.2025-02-28.log' removed '/var/log/myapp/error.2025-02-15.log'
2. 特定のファイルに対してchmodを一括適用する
# /var/www以下の.phpファイルをすべて644に変更 $ find /var/www/html -name "*.php" -print0 | xargs -0 chmod 644 # 確認 $ find /var/www/html -name "*.php" -print0 | xargs -0 ls -l | head -5 -rw-r--r-- 1 apache apache 3142 4月 2 10:00 /var/www/html/index.php -rw-r--r-- 1 apache apache 1254 4月 2 10:00 /var/www/html/config.php
grepとの連携
1. 特定のパターンを含むファイルを検索して処理する
grep -l はマッチしたファイル名だけを出力します。これを xargs に渡すことで、「特定の文字列を含むファイルだけに処理を施す」という操作が実現できます。# "ERROR"を含むログファイルをすべて表示 $ grep -rl "ERROR" /var/log/myapp/ | xargs ls -lh -rw-r--r-- 1 root root 12K 4月 5 03:00 /var/log/myapp/app.log -rw-r--r-- 1 root root 4.5K 4月 4 03:00 /var/log/myapp/app.2026-04-04.log # "ERROR"を含む行だけを抽出して1つのファイルに集約 $ grep -rl "ERROR" /var/log/myapp/ | xargs grep "ERROR" > /tmp/all_errors.txt
2. grep -l | xargs sed -i で複数ファイルを一括置換
設定ファイルの一括変更は、サーバー管理で頻繁に発生する作業です。# 「old_server」を含むファイルを検索し、一括で「new_server」に置換 $ grep -rl "old_server" /etc/ | xargs sed -i "s/old_server/new_server/g" # 置換前に対象ファイルを確認(安全策) $ grep -rl "old_server" /etc/ | xargs ls -l
※ 本番環境では、置換前に必ず対象ファイルを確認してください。
3. 設定ファイルの特定の行をまとめて確認する
# /etc以下のconfファイルのうち "Listen" という設定を含むファイルを探す $ find /etc -name "*.conf" -print0 | xargs -0 grep -l "Listen" /etc/httpd/conf/httpd.conf /etc/nginx/nginx.conf
応用・実務Tips
1. find + xargs vs find -exec の使い分け
findで見つけたファイルにコマンドを実行する方法は2つあります。# xargs方式(高速:コマンドをまとめて実行) find /var/log -name "*.log" -print0 | xargs -0 gzip # -exec \\\\; 方式(1ファイルずつ実行) find /var/log -name "*.log" -exec gzip {} \\; # -exec + 方式(xargsと同様にまとめて実行) find /var/log -name "*.log" -exec gzip {} +
・-exec \\\\;方式:1ファイルずつコマンドを起動するため遅いが、確実に1つずつ処理できる
・-exec +方式:xargsと同様にまとめて実行。外部コマンドへのパイプが不要な分シンプル
基本的にはxargs方式か -exec + 方式を使い、ファイル名にスペースが含まれる可能性がある場合は -print0 | xargs -0 が最も安全です。
2. -P で並列実行して処理を高速化する
-P オプションで、複数のプロセスを同時に実行できます。CPUやネットワークがボトルネックにならない処理では、大幅な時間短縮が可能です。# 4並列でgzip圧縮を実行 $ find /var/log -name "*.log" -print0 | xargs -0 -P 4 gzip # 処理状況(別ターミナルで確認) $ ps aux | grep gzip root 12341 98.0 0.0 gzip /backup/app.2026-03-28.log root 12342 97.5 0.0 gzip /backup/app.2026-03-27.log root 12343 98.2 0.0 gzip /backup/error.2026-03-28.log root 12344 96.8 0.0 gzip /backup/error.2026-03-27.log
3. -p で確認プロンプト付き実行、-t で実行コマンドを表示
削除や変更を伴う操作では、実行前の確認が重要です。# 実行前にy/nの確認プロンプトを表示 $ find /tmp -name "*.bak" | xargs -p rm -f # 実行するコマンドを標準エラー出力に表示(デバッグ用) $ find /var/log -name "*.log" -print0 | xargs -0 -t gzip gzip /var/log/audit/audit.log.3 /var/log/audit/audit.log.4
4. 入力が空の場合にコマンドを実行しない(--no-run-if-empty)
findやgrepの結果が0件だった場合、xargsはデフォルトで引数なしでコマンドを実行してしまいます。--no-run-if-empty(短縮: -r)を付けることで、入力が空の場合はコマンドを実行しません。# 対象ファイルがゼロ件でも安全 $ find /tmp -name "*.nonexistent" -print0 | xargs -0 --no-run-if-empty rm -f # (マッチなし→rmは実行されない) # 短縮形 $ find /tmp -name "*.nonexistent" | xargs -r rm -f
トラブルシュート・エラー対処
1. ファイル名にスペースや特殊文字がある場合の問題
xargsのデフォルトでは、スペース・タブ・改行が区切り文字です。ファイル名にこれらが含まれると、意図しない分割が発生します。# 問題の例:"my report.txt" が "my" と "report.txt" に分割される $ echo "my report.txt" | xargs rm rm: cannot remove 'my': No such file or directory rm: cannot remove 'report.txt': No such file or directory # 解決策:-print0 と -0 を組み合わせる $ find /home -name "*.txt" -print0 | xargs -0 rm -f # find以外の入力では -d でデリミタを改行に変更する $ ls | xargs -d '\ ' rm -f
2. ファイル名に改行が含まれる場合
ファイル名に改行文字が入っていると -print0 / -0 の組み合わせでも誤動作します(実際にはほぼありませんが、セキュリティ要件が厳しい環境では意識が必要です)。対処としては find の -exec オプションを直接使う方法が堅牢です。# 最も安全な書き方(改行を含むファイル名にも対応) $ find /tmp -name "*.tmp" -exec rm -v {} \\; removed '/tmp/sess_a3f2b.tmp' removed '/tmp/sess_c9d1e.tmp'
3. 「Argument list too long」エラーの回避
ワイルドカード展開でファイル数が多すぎると、シェルの引数長制限に引っかかります。xargsを使うことでこのエラーを回避できます。# エラーになるケース(ファイル数が多すぎる) $ rm /var/log/myapp/*.log -bash: /bin/rm: 引数リストが長すぎます # OK: xargsを使えば自動的に分割して渡してくれる $ find /var/log/myapp -name "*.log" -print0 | xargs -0 rm # 現在のシステムの引数長制限を確認 $ getconf ARG_MAX 2097152
4. xargsに渡すコマンドでリダイレクトを使う方法
xargsの中でリダイレクト(>や>>)を直接使うことはできません。シェルがxargsの実行前にリダイレクトを解釈してしまうためです。# NG(リダイレクトがxargsではなくシェルに解釈される) $ find /var/log -name "*.log" | xargs head -1 > result.txt # OK(sh -c でサブシェルを使う) $ find /var/log -name "*.log" | xargs -I{} sh -c "head -1 {} >> result.txt" # OK(ファイルごとに別のファイルに出力) $ find /var/log -name "*.log" | xargs -I{} sh -c "wc -l {} > {}.count"
5. xargs: command not found が出る場合
稀にコンテナ環境や最小インストール環境で xargs がない場合があります。# RHEL/CentOS系 $ sudo dnf install findutils # Ubuntu/Debian系 $ sudo apt install findutils
本記事のまとめ
xargsの主要な使い方を一覧にまとめます。| やりたいこと | コマンド |
|---|---|
| findの結果にコマンドを実行 | find パス 条件 | xargs コマンド |
| スペースを含むファイル名を安全に処理 | find パス 条件 -print0 | xargs -0 コマンド |
| 引数を任意の位置に挿入 | find パス 条件 -print0 | xargs -0 -I{} コマンド {} |
| 引数の個数を制限して実行 | find パス 条件 | xargs -n 数 コマンド |
| 複数ファイルを一括置換 | grep -rl "文字列" パス | xargs sed -i "s/旧/新/g" |
| 4プロセス並列で処理する | find パス 条件 -print0 | xargs -0 -P 4 コマンド |
| 確認プロンプト付きで実行 | find パス 条件 | xargs -p コマンド |
| 実行コマンドを表示(デバッグ) | find パス 条件 -print0 | xargs -0 -t コマンド |
| 入力が空のときコマンドを実行しない | find パス 条件 -print0 | xargs -0 --no-run-if-empty コマンド |
| リダイレクトを使う | find パス 条件 | xargs -I{} sh -c "コマンド {} >> 出力先" |
| Argument list too longを回避 | find パス -name "パターン" -print0 | xargs -0 rm -f |
xargsやfindを現場で使いこなせるようになりたいですか?
コマンドのオプションを覚えるだけでは、現場の問題には対応できません。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます