第7回 | find と xargs で複数ファイルをまとめて処理する | 対象集めと橋渡しをつなぐ|UNIX Cafe

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

System Note $ cat /proc/ai-disclosure

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

第7回 | find と xargs で複数ファイルをまとめて処理する | 対象集めと橋渡しをつなぐ|UNIX Cafe

Unixコマンド実践 | 第7回

前回find を使って、目的のファイルを正確に探す方法を見ました。ファイルを見つけられるようになると、次は「その見つけたファイルへまとめて何かしたい」という場面が出てきます。そこで役立つのが xargs です。

今回は、find で集めた結果をそのまま次の作業へ渡す方法を見ていきます。find が対象集め、xargs が橋渡し。この役割分担が見えてくると、複数ファイルへの確認作業も進めやすくなります。

まだターミナルに慣れていない方は、「まず対象を探して、その一覧を次のコマンドへ渡す 2 段階の流れ」だと思って読むと入りやすいです。この記事では、探す、確認する、つなげる、の順で整理します。

📝 この記事で学べること

  • findxargs の役割分担
  • echo で確認する流れ
  • wc -l で複数ファイルをまとめて見る方法
  • head -n 1 で中身をざっと確認する方法
目次

まず find で対象を集める

最初にやるのは、対象を正しく集めることです。ここで思ったファイルだけが並ぶかを確かめておくと、あとの処理も安心して進められます。

logs/
  access.log
  error.log
  old.log

たとえば logs の中に次の 3 つのファイルがあるとします。

find ./logs -name "*.log"

実行すると、logs の下にある .log ファイルが一覧で表示されます。ここで思ったファイルだけが並んでいれば、このあとの処理も安心です。

./logs/error.log
./logs/old.log
./logs/access.log

ここで思ったファイルだけが並ぶかを確認しておくと、このあとに続く処理も安心して進めやすくなります。

次に xargs で橋渡しする

いきなり本番の処理へ進む前に、まず echo で「何が渡るか」を確かめます。

この一手があると、流れをつかみやすくなります。| は「左の結果を右へ渡す」という意味で、find で見つけたファイル一覧を xargs が受け取り、それを echo の引数として並べる流れです。

find ./logs -name "*.log" | xargs echo

実行すると、3 つのファイルが空白区切りで 1 行に並んで表示されます。find の結果がそのまま次へ渡っていることが、これで見て取れます。

./logs/error.log ./logs/old.log ./logs/access.log

wc -lhead へつなげる

渡るものが確認できたら、そのまま複数ファイルをまとめて見る作業へ進めます。行数を見たいときや、先頭だけ見たいときに便利です。

find ./logs -name "*.log" | xargs wc -l
find ./logs -name "*.log" | xargs head -n 1

wc -l を通すと、各ファイルの行数が一覧で出て、最後に合計(total)の行が付きます。head -n 1 のほうは、各ファイルの前に ==> ファイル名 <== という見出しが自動で付き、どのファイルの先頭行かが分かります。

まず探す。次に echo で確認する。それから確認系のコマンドへつなげる。この順番で進めると、流れを見失いにくくなります。

なぜ xargs を挟むのか

xargs を挟む意味は、付けない場合と比べると分かりやすいです。

find ./logs -name "*.log" | wc -l

この結果は 3 とだけ表示されます。これはファイルの中の行数ではなく、「見つかったファイルの個数(=3)」を数えているからです。xargs を挟むと、一覧を引数に変えてから渡すので、各ファイルの中身の行数を数えられます。

よくあるミスと保存の一言

混乱しやすいのは、findxargs の役割が頭の中で混ざることです。find は対象を集める、xargs は集めた一覧を次のコマンドへ渡す。この 2 段階で考えると整理しやすいです。

もう 1 つは、いきなり本番の処理へ進んで「何に対して実行されたのか」が見えなくなることです。だからこそ、途中で echo を挟んで確かめる形が安心です。

find ./logs -name "*.log" | xargs wc -l > log_line_count.txt

名前にスペースが入るファイルがあるときは、次の形が安全です。

find ./logs -name "*.log" -print0 | xargs -0 wc -l

-print0find 側、-0(ゼロ)は xargs 側の指定で、この 2 つはセットで使います。最初は読み飛ばしても大丈夫です。

手を動かすミニ練習

ここまでの内容が整理できたら、本文とは少し対象や渡し先を変えて、「何が渡るか」を確認してみましょう。この記事では削除や変更までは行わず、表示だけで確かめる流れに絞って進めます。

  1. find ./logs -name "error.log" | xargs echo を見て、対象を 1 つの名前に絞ってから渡していると確認する
  2. find ./logs -name "*.log" -type f | xargs wc -l を見て、ファイルだけに絞った一覧を行数確認へ渡していると言い換えてみる
  3. find ./logs -name "*.log" | xargs head -n 2 を見て、各ログの先頭 2 行をまとめて確認する流れを左から順に読んでみる

実際に手元の環境で試せる方は、安全な拡張子を対象にして、対象を絞る条件を 1 つずつ変えながら次へ渡すと流れをつかみやすいです。まずは「表示だけ」にとどめると安心です。

探した結果を次へ渡せると流れがつながる

対象を探すところと、その対象に対して何かするところがつながると、ターミナル作業の幅が一気に広がります。findxargs は、その橋渡しの基本形として覚えておく価値があります。

次回予告

次回はシリーズ最終回として、ここまでのコマンドをつないで小さな作業を通しで見ていきます。探す、抜く、並べる、数える、つなぐが、どう 1 本の流れになるかを整理します。

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

この記事を書いた人

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

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

Created by UNIX Cafe

目次