xargsコマンドの使い方|findやgrepの出力を引数に渡して一括処理する方法


この記事の監修:宮崎智広(Linux教育歴15年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips > xargsコマンドの使い方|findやgrepの出力を引数に渡して一括処理する方法
「findで見つけたファイルをまとめて削除したいのに、パイプでつなぐとうまくいかない」
「コマンドの引数にファイル一覧を渡したいけど、数が多すぎてエラーになる」

xargsは、標準入力から受け取ったデータをコマンドの引数として渡すコマンドです。findやgrepの出力をそのまま別のコマンドに引き渡せるため、ファイルの一括処理やログの一括検索など、日常的なサーバー管理作業を大幅に効率化できます。
この記事では、xargsの基本的な使い方から、スペースを含むファイル名の安全な処理、並列実行、find -execとの使い分けまで、実務で必要な知識を網羅します。
【この記事でわかること】
・xargsは標準入力の内容を別コマンドの引数に変換して実行する仕組み
・find -print0 と xargs -0 の組み合わせでスペースを含むファイル名も安全に処理できる
・-P オプションで並列実行し、大量ファイルの処理を高速化できる
・find -exec \; / -exec + / xargsの使い分けを把握しておくと現場で迷わない
・--no-run-if-emptyや-pを活用して本番環境でも安全に実行できる

「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

なぜxargsが必要なのか?~パイプだけでは解決できない場面~

Linuxでは、コマンドの出力をパイプ(|)で次のコマンドに渡すのが日常的です。しかし、パイプが渡すのは「標準入力」であって「引数」ではありません。

この違いが問題になる典型例を見てみましょう。

# これは動かない(rmは標準入力を受け付けない) find /tmp -name "*.log" | rm # xargsを使えば、findの出力をrmの「引数」として渡せる find /tmp -name "*.log" | xargs rm

grepやcatのように標準入力を読み取るコマンドならパイプだけで動きます。しかし、rm、cp、mv、chown、chmodなどは「引数」としてファイル名を受け取るため、パイプだけでは渡せません。

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

スペース区切りで引数が展開されていることが確認できます。問題がなければ echo を rm 等の本命コマンドに差し替えます。

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'

xargsは受け取った入力を、スペースや改行で区切って引数に変換します。上の例では、findが出力したファイルパスがそのままrmの引数として渡されます。

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/

-I{} を指定すると、入力を1行ずつ処理します。{} の部分が入力値に置き換わるため、コマンドの途中に引数を挿入できます。

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の -print0 はファイル名をNULL文字(\\0)で区切って出力し、xargsの -0 はNULL文字を区切りとして受け取ります。この組み合わせにより、スペースや特殊文字を含むファイル名でも正しく処理できます。

※ 本番環境で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'

-v オプションを rm に付けることで、削除したファイルが表示されるため後から確認できます。

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

findコマンドの詳しい使い方については、別記事で解説しています。条件指定のオプションも合わせて確認しておくと応用範囲が広がります。

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

grepコマンドの詳しい使い方については別記事で解説しています。-r(再帰検索)や -l(ファイル名のみ出力)オプションと組み合わせることで、xargsとの連携がさらに強力になります。

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

grep -r の -l オプションは、マッチした「行」ではなく「ファイル名」だけを出力します。これをxargsでsed -iに渡すことで、複数ファイルの一括置換が1行で完了します。

※ 本番環境では、置換前に必ず対象ファイルを確認してください。

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 {} +

xargs方式:引数をまとめて渡すため、コマンドの起動回数が少なく高速。大量ファイルの処理に向く
-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

-P の数はCPUコア数を目安にしてください。-P 0 を指定すると可能な限り多くのプロセスを同時実行しますが、サーバーの負荷に注意してください。

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

-p はy(yes)を入力しない限り実行しないため、本番環境での安全策として有効です。-t は実行されるコマンドを表示するだけで、確認なしに実行します。

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

本番スクリプトでxargsを使う場合は、この --no-run-if-empty を習慣的につけておくと余計な事故を防げます。

トラブルシュート・エラー対処

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'

ただし -exec は1件ずつコマンドを起動するため、ファイル数が多い場合は xargs -0 より処理が遅くなります。パフォーマンスと安全性のバランスで判断してください。

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

xargsは引数が多くなると自動的に複数回に分割してコマンドを呼び出すため、ARG_MAX の制限を回避できます。

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"

sh -c を使うことで、リダイレクトやパイプをxargsの中で利用できます。複雑な処理を行う場合は、sh -c の中にコマンドを書くのが定石です。

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
find・grep との連携パターンを一通り覚えておけば、日常の運用作業が格段に効率化されます。ぜひ手元の環境で試してみてください。

xargsやfindを現場で使いこなせるようになりたいですか?

コマンドのオプションを覚えるだけでは、現場の問題には対応できません。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。


無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録

宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として15年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。