Linuxコマンド一覧

xargsコマンド|一覧を次のコマンドの引数に変える

__ __ _ _____
\ \ / /__| |_|_ _|__ _ __ _ __ ___
\ \ /\ / / _ \ '_ \| |/ _ \ '__| '_ ` _ \
\ V V / __/ |_) | | __/ | | | | | |
\_/\_/ \___|_.__/|_|\___|_| |_| |_| |_
 
xargs を試すためのサンドボックスです。実機のファイルには影響しません。
user@webterm:~/project$
 

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

1つずつ渡す

-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 に差し替えて確かめてください。

標準入力を読むコマンドには要りません。 grepsort は自分で標準入力を読むので、xargs を挟む必要はありません。 挟むと引数として渡ってしまい、意味が変わります。

手を動かして覚える

webterm.appこのサイト

learn.webterm.app別のサイト

>_WEBTERM LEARN

WebTerm Learn|1つのコマンドから、使える状態へ

コマンドは単体で覚えるより、実際の作業の流れの中で使うほうが身につきます。順番に積み上げていくコースがあります。

コースを見る

関連するコマンド

find / grep / ls / rm

よくある質問

xargs は何のためにあるのですか?
`rm` や `wc` のように、標準入力ではなく**引数**を受け取るコマンドへ、パイプの結果を渡すためです。`find ... | rm` は動きませんが、`find ... | xargs rm` は動きます。
-I {} は何をしていますか?
受け取った値を置く場所を決めています。`{}` の位置に1つずつ差し込まれるので、`cp {} backup/` のように引数の途中に入れられます。
-n 1 との違いは何ですか?
`-n 1` は1回に渡す個数を1つにするだけで、位置は末尾のままです。位置を変えたいときが `-I` です。
ファイル名にスペースが入っていると壊れます。
既定では空白を区切りとして読むので、`my file.txt` が2つの引数として渡るためです。`-I {}` を使うと1行をまるごと1つの値として扱うので、この形なら壊れません。
何も渡ってこないときはどうなりますか?
コマンドが引数なしで1回実行されます。`rm` のように引数が必須のコマンドではエラーになるので、消す系の操作は先に `echo` を挟んで確かめてください。