Linux|findコマンドでファイル名を検索する方法とexecオプションの使い方

シェル/bash

こんにちは。

普段はIT業界についてのブログを執筆してるエンジニアです。
» 参考:プログラマーの年収は200万円以下です【IT業界の残酷な成功法則】
» 参考:【一生使える本です】bashの解説書 厳選3選【おすすめ】

今回は、linuxについての解説記事です。

findコマンドのexecオプションについて調べる人

findコマンドについて調べる人
「findコマンドでファイル名を指定して検索する方法が知りたい。
また、特定の条件に合致したファイルに対して一気に処理がしたいので、findコマンドのexecオプションの使い方を確認したい。コピペして再利用できるよう具体例にして欲しい。」

こんな悩みを解決します。

この記事を書いている私はIT業界歴12年、うちサーバエンジニア歴6年、年収1,000万円ちょっとの金融系エンジニアです。IRIXやSolarisなどのUnixやmac、Linuxなど様々なUNIX系環境を扱ってきました。

これまでの経験を踏まえ、コマンドの解説に留まらず実務視点で利用方法を記事にしました。お役にたちましたら幸いです。

本記事で扱うのはLinux/Macのfindコマンドです

本記事では、LinuxまたはMac環境を前提にしています。それ以外のUNIX環境では一部の動作が異なることがあります。

本記事の内容

  • 【構文】find 《検索ディレクトリ》 《ファイル名》
  • 【構文】find 《検索ディレクトリ》 -exec 《実行コマンド》 \;
  • 【構文】find 《検索ディレクトリ》 -exec 《実行コマンド》 +
  • 運用業務上の注意点

findコマンドでファイル名を検索する方法

findコマンドのオプションは、以下の構文を用います。

find 《検索ディレクトリ》 《ファイル名》

find を使った簡単な例

file1.txtという名前のファイルを検索します。

find .  'file1.txt'

実行結果は以下の通りです。findはサブディレクトリまで再帰的に検索して結果を表示します。
[実行結果]

./file1.txt
./DIR/file1.txt

ワイルドカードを使って名前を指定する

ワイルドカードを使って、[file*.txt]という条件で該当するファイルを検索します。

find .  'file*.txt'

実行結果は以下の通りです。マッチしたファイルの一覧が出力されました。
[実行結果]

./file1.txt
./file2.txt
./file3.txt
./DIR/file1.txt

【構文】findのexecオプションの構文

findコマンドのexecオプションは、以下の構文を用います。

find 《検索ディレクトリ》 -exec 《実行コマンド》 \;

find -execの簡単な例

まずは簡単な例から示します。カレントディレクトリ(.)以下にあるファイル(-f)に対して、それぞれ個別に({} \;)、ls -lを実行する例です。

$ find . -type f -exec ls -l {} \;
-rw-r--r--  1 root  staff  30  7 27 16:27 ./file2.txt
-rw-r--r--  1 root  staff  30  7 27 16:33 ./file3.txt
-rw-r--r--  1 root  staff  30  7 27 16:24 ./file1.txt

なお、ファイル(-f)に対象を絞っているのは、find結果にディレクトリが含まれるのを防ぐためです。ディレクトリが含まれると、ディレクトリ以下のファイルの情報(ls -l)まで表示されてしまいます。

実はfind結果をls形式で表示したい場合は、-execを使わなくても最初から専用のオプション(-ls)があります。これを用いて、次のように記述するのが一般的です。

$ find . -type f -ls
-rw-r--r--  1 root  staff  30  7 27 16:27 ./file2.txt
-rw-r--r--  1 root  staff  30  7 27 16:33 ./file3.txt
-rw-r--r--  1 root  staff  30  7 27 16:24 ./file1.txt

検索結果をまとめて-execの引数にする

上の例では、file2→file3→file1の順に結果が表示されています。これは、findがファイルを見つけた順番に個別に-execで指定したコマンドを実行し結果を表示しているからです。
《findで見つかったファイルに対して、こんなイメージで処理しています》

 ls -l file2.txt
 ls -l file3.txt
 ls -l file1.txt

個別に実行するのではなく、次のようにまとめて実行する方法を解説します。

 ls -l file2.txt file3.txt file1.txt

構文

まとめて実行するには、末尾を+にします。

find 《検索ディレクトリ》 -exec 《実行コマンド》 +

find -execの簡単な例

findで見つかったfile1〜3の3つのファイルをまとめてls -lする事で、1から3に順番に表示することができました。

この方式ならば、ls -lrtのように引数に与えられたファイルに対する実行結果を並び替える処理も機能します。

また対象のファイルごとにlsプロセスを都度生成しないため処理が早く、CPUなどリソースへの負荷も一般的に低いはずです。ただしfindで見つかったファイルがずらっと引数として並びますので、大量のデータを扱う際には引数の上限には注意が必要です(一般に、UNIXのシェルの引数の文字の上限は20万字程度だそうです)。

$ find . -type f -exec ls -l {} +
-rw-r--r--  1 root  staff  30  7 27 16:24 ./file1.txt
-rw-r--r--  1 root  staff  30  7 27 16:27 ./file2.txt
-rw-r--r--  1 root  staff  30  7 27 16:33 ./file3.txt

【find】 -execオプション利用時の業務上の注意点

find -execオプションを業務で使う上での注意点

find -execは汎用性が高いコマンドで、使いこなせば検索を効率的に行えます。
一方findの結果次第では処理対象が非常に多くなり、想定外にサーバが高負荷になる事象も起こり得ます。
対象範囲を絞ったり、execオプションで実行するコマンドが負荷の高いものでないか確認することも有用です。また、本番環境で実行する際はインフラリソースへの影響評価も含め、十分なテストと準備をすべきです。

おわりに

今回は以上です。findコマンドの-execオプションについて解説しました。実務等で利用する場合の参考になりますと幸いです。

Blog TOP  Linuxコマンドを勉強したい人向け|Linuxの使い方 記事まとめ

Linux&Linuxコマンドを勉強したい人向けの記事もくじ

用語解説・技術一般

  "UNIXとLINUX"の違いについて解説します
  CUIとGUIの違い・特徴について解説します

サーバリソースを確認するコマンドの使い方

  【Linux】CPU使用率を確認する3つの方法を解説します
  【Linux】topコマンドで,CPU消費の原因を特定する方法
  【Linux】ps実行時に-efオプションを付ける理由について
  【Linux】メモリ使用率を確認する|容量・空きの確認も
  【Linux】ディスク容量を確認する|ディスク容量監視も

ファイル操作に関するコマンドの使い方

  【Linux】ファイルの行数をカウントする方法を解説
  【Linux】文字コード変換ならiconvコマンド1択です
  【Linux】/dev/nullを、エンジニアが使う2つの目的
  【Linux】findのexecオプションの使い方とその注意点
  【Linux】findの結果から圧縮ファイルを作るコマンド
  【Linux】hostsの場所はどこ?→/etc/hostsにあります
  【Linux】touchコマンドで,時刻更新&空ファイル作成

Linux管理者用コマンドの使い方

  【Linux】再起動コマンド(shutdown)の使い方と注意点

よく使う便利なコマンドの使い方

  【Linux】改行なしでechoコマンドを使う時の -nオプション
  【Linux】sleepコマンドの使用例と注意点について解説する
  【Linux】rmコマンドでディレクトリを削除する方法を解説
  【Linux】ファイルを削除するコマンド2選【rm以外もあり】
  【Linux】awkの区切り文字を指定する,-Fオプションを解説
  【Linux】sedで文字列の置換をするeオプションを解説する
  【Linux】dateコマンドのフォーマットとその便利な使い方
  【Linux】大文字から小文字に変換する方法【小文字から大文字も】

シェルの便利機能

  【Linux】コマンド履歴を検索する【Ctrl+r】