第3回 | xargs で同じ作業をまとめて片づける | 一覧を次のコマンドへ渡す|UNIX Cafe

* 当サイトでは、コンテンツの一部に広告を掲載しています。

System Note $ cat /proc/ai-disclosure

本記事の構成および論理分析にはAI(人工知能)を使用しています。情報の正確性は、システム管理者(UNIXユーザー)による手動検証済みです。

第3回 | xargs で同じ作業をまとめて片づける | 一覧を次のコマンドへ渡す|UNIX Cafe

Unixコマンド実践 | 第3回

ターミナルでは、対象だけ変えて同じコマンドを何度も打ちたい場面がよくあります。ファイル名だけ変えて、同じ確認を繰り返すようなときです。

今回は xargs を使って、その繰り返しをまとめる方法を見ていきます。新しいことをたくさん覚えるというより、一覧を次のコマンドへ渡すための道具として考えると分かりやすいです。

ターミナルにまだ慣れていない方は、「縦に並んだ一覧を、次のコマンドの引数に変える道具」だと思って読むと入りやすいです。この記事では、まず何が渡るかを目で確認しながら進めます。

📝 この記事で学べること

  • xargs の役割
  • 一覧を次のコマンドへ渡す考え方
  • echo で確認する流れ
  • wc -l へのつなぎ方と結果の保存
目次

同じコマンドを何回も打つ代わりにまとめる

たとえば複数ファイルの行数を見たいとき、手でやるなら wc -l を何回も打つことになります。件数が増えると、少しずつ面倒になってきます。

そこで xargs を使うと、一覧に書かれた対象をまとめて次のコマンドへ渡せます。実際に手を動かしながら流れを見ていきましょう。

まず vi で、対象ファイルの一覧を書いた targets.txt を作ります。

vi targets.txt

i を押して入力モードに切り替え、次の3行を入力します。

memo1.txt
memo2.txt
memo3.txt

入力が終わったら Esc を押してノーマルモードに戻り、:wq で保存して終了します。

:wq

次に、行数を確認する対象として、中身のあるファイルを3つ作ります。

echo "apple" > memo1.txt
echo "banana" > memo2.txt
echo "cherry" > memo3.txt

準備が整いました。xargs を使って、3つのファイルの行数をまとめて確認します。

cat targets.txt | xargs wc -l

準備が整いました。|(パイプ)で cat の出力を xargs に渡し、wc -l の引数として使う流れで、3つのファイルの行数をまとめて確認します。

cat targets.txt | xargs wc -l

ここで出てくる | は、「左の結果を右へ渡す」という記号で、パイプと呼びます。たとえば cat targets.txt だけ実行すると、ファイルの中身が画面に表示されます。その表示結果をそのまま xargs に渡すのが | の役割です。つまりこのコマンドは、「cat で一覧を表示し、その結果を xargs が受け取り、最後に wc -l の引数として渡す」という流れになっています。

このファイルは「1行に1つずつ対象が書かれた一覧」です。xargs はこの1行ずつの情報を受け取って、横並びの引数へ変えて次に渡します。実際には wc -l memo1.txt memo2.txt memo3.txt のようにまとめて渡したのと近い形になります。ファイルが増えても、打ち直しを減らせるのが分かりやすいところです。

       1 memo1.txt
       1 memo2.txt
       1 memo3.txt
       3 total

まずは echo で確認する

xargs を使うとき、最初に何が渡るかを確認しておくと安心です。そこで便利なのが echo です。実際のコマンドを実行する前に echo に渡すと、引数が横並びで表示されるだけなので、意図した対象が並んでいるかどうかを目で確認できます。

cat targets.txt | xargs echo

表示が次のように見えれば、意図した対象が渡っていると判断しやすくなります。

memo1.txt memo2.txt memo3.txt

削除や変更のような処理に進む前に、この確認を入れておくと、順番に進めやすくなります。

つまずきやすい点と保存の一言

xargs で最初につまずきやすいのは、空白を含む名前や改行の扱いです。今回のサンプルのように単純なファイル名なら分かりやすいですが、実際のファイル名にはスペースが入っていることもあります。この点への対処は、このシリーズの第7回「findxargs をつないで複数ファイルを扱う」で改めて取り上げます。まずは単純な一覧で xargs の基本的な動きをつかんでおきましょう。

もう1つのよくある混乱は、cat targets.txt | xargs の形だけを丸ごと覚えて、何を渡しているのか見えなくなることです。xargs は「標準入力で受け取った一覧を引数に変える」という役割だけを担っている、と短く意識すると整理しやすいです。

結果を残したいなら、次のように出力を保存できます。

cat targets.txt | xargs wc -l > line_count.txt

保存できたか確認したいときは、ls で確認できます。

ls line_count.txt

ファイル名が表示されれば、正しく保存されています。中身を確認したいときは cat で見られます。

cat line_count.txt

xargs は「一覧を次のコマンドの引数に渡す」、echo は「まず確認する」と覚えておくと、読み返したときの整理がしやすくなります。

手を動かすミニ練習

今度は別のファイルで、同じ流れを自分で試してみましょう。テーマはカフェメニューです。

まず vi で、対象ファイルの一覧を書いた menu.txt を作ります。

vi menu.txt

i を押して入力モードに切り替え、次の3行を入力します。

latte.txt
espresso.txt
cappuccino.txt

入力が終わったら Esc を押してノーマルモードに戻り、:wq で保存して終了します。

:wq

続けて、各メニューの説明を1行ずつ書いたファイルを3つ作ります。

echo "espresso with steamed milk" > latte.txt
echo "strong black coffee" > espresso.txt
echo "espresso with milk foam" > cappuccino.txt

準備が整いました。まず echo で引数を確認してから、wc -l で行数を見てみましょう。

cat menu.txt | xargs echo
cat menu.txt | xargs wc -l

1行目では latte.txt espresso.txt cappuccino.txt と横並びに表示され、2行目ではそれぞれのファイルの行数が出力されます。本文と同じ流れで動いていることが確認できたら、練習完了です。

一覧を次へ渡せると作業を進めやすくなる

ファイル名だけ変えて同じ作業を何度も繰り返す場面では、xargs が役立ちます。まず一覧を作り、それを次のコマンドへ渡す。この形に慣れると、ターミナル作業の見え方も少しずつ変わってきます。

次回予告

次回は、sed を使って同じ修正をまとめて処理する方法を見ていきます。置換と削除を中心に、画面で確認しながら進める流れを整理します。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

のいのアバター のい UNIX Cafe マスター

Macintosh Color Classicから始まった旅は、長いWindows時代を経て、Windows10のサポート終了をきっかけにUNIXの世界へ戻ってきました。UNIX Cafeでは、UNIX・Linux・そしてMacな世界を、むずかしい言葉を使わず、物語のように書いています。プログラミングは、アイデアをコンピューターに伝えるための言葉です。簡単な単語と文法を覚えれば、誰でもコマンドを使えます。ぜひ一度、やさしいプログラミングの世界をのぞいてみてください。

Created by UNIX Cafe

目次