xargs はパイプで受け取った一覧を、次のコマンドの引数として渡すコマンドです。`find` の結果をまとめて処理する書き方、1つずつ渡す `-n`、位置を指定する `-I {}` を、ブラウザ上のターミナルで打ちながら確認できます。
最終更新: 2026-09-06
一覧を出すコマンド | xargs [オプション] 実行するコマンド
パイプで受け取った内容を、次のコマンドの引数として並べ直します。
コマンドには、標準入力を読むものと、引数しか受け取らないものがあります。
rm は後者です。
$ find tmp -name '*.tmp'
tmp/cache1.tmp
tmp/cache2.tmp
$ find tmp -name '*.tmp' | rm
rm: missing operand
一覧は届いているのに、rm はそれを見ていません。
xargs を挟むと、一覧が引数になります。
$ find tmp -name '*.tmp' | xargs rm
$ ls tmp
消えました。 これが xargs の役割です。
既定では、受け取った値をまとめて1回渡します。
$ ls logs
access.log app.log error.log
$ ls logs | xargs echo
access.log app.log error.log
find の結果をそのまま数える、といった使い方が自然にできます。
$ find logs -name '*.log' | xargs wc -l
3 logs/app.log
2 logs/access.log
1 logs/error.log
6 total
grep -l(一致したファイル名だけを出す)と組むと、「エラーが出ているファイルだけ」を次の処理に回せます。
$ grep -l ERROR logs/*.log | xargs wc -l
3 logs/app.log
1 logs/error.log
4 total
-n 1 を付けると、1回に1つずつ渡します。
$ echo 'a b c' | xargs -n 1 echo
a
b
c
引数の末尾以外に置きたいときは -I を使います。
$ find logs -name '*.log' | xargs -I {} cp {} backup/
$ ls backup
access.log app.log error.log
{} の場所に、受け取った値が1つずつ入ります。
cp のように「元 → 先」の順が決まっているコマンドでは、この形でないと書けません。
$ ls logs | xargs -I {} echo 'file: {}'
file: access.log
file: app.log
file: error.log
xargs は、探した結果をそのまま処理に回すときに打つコマンドです。
| 場面 | 打ち方 |
|---|---|
| 見つけたファイルを消す | find . -name '*.tmp' | xargs rm |
| 見つけたファイルの行数を数える | find . -name '*.log' | xargs wc -l |
| 一致したファイルだけ処理する | grep -l ERROR *.log | xargs wc -l |
| 1つずつ別の場所へコピーする | ls *.log | xargs -I {} cp {} backup/ |
| 何が渡るのかを先に見る | find . -name '*.tmp' | xargs echo |
消す前に echo で確かめてください。
xargs rm は確認なしで実行されます。
xargs echo に差し替えて、渡る一覧を目で見てから本番を打つのが安全です。
空白を含むファイル名で壊れます。
xargs は既定で空白を区切りとして読むので、my file.txt は2つの引数として渡ります。
-I {} を使うと1行をまるごと1つの値として扱うので、この形なら壊れません。
渡るものが無いときも1回実行されます。
$ find . -name 'nope*' | xargs rm
rm: missing operand
一致が0件でも rm が引数なしで動きます。
消す系の操作では、まず xargs echo に差し替えて確かめてください。
標準入力を読むコマンドには要りません。
grep や sort は自分で標準入力を読むので、xargs を挟む必要はありません。
挟むと引数として渡ってしまい、意味が変わります。
webterm.appこのサイト
ターミナル基礎
よく使うコマンドを学ぶ
learn.webterm.app別のサイト
