【Linux】findコマンドでファイルを検索する方法|作業効率向上

Linux

Linux環境でのシステム開発業務において、
目的のファイルやディレクトリを探したい場面がよくあります。

そんなときに使えるのが、find コマンドです。

  • 手順書どおりの場所に設定ファイルが見当たらないときに検索する
  • 更新されたファイルだけを確認する
  • 容量の大きいファイルを特定する

といったことができるため、調査作業の効率化に欠かせないコマンドです。

検索条件を使い分けることにより、
目的のファイルを効率よく見つけることができるようになります。

かけりゅー
かけりゅー

本記事では、find コマンドの基本的な使い方をはじめ、
システム開発業務で利用頻度が高いオプションを具体例とともにまとめています。

findコマンドとは

find コマンドは、指定した検索条件でファイルやディレクトリを検索するコマンドです。

設定ファイルのありかを特定したい場合など、
目的のファイルやディレクトリを素早く見つけたいときに使用します。

コマンドの基本構文は以下のとおりです。

find [検索開始ディレクトリ] [検索条件]

検索条件に指定した内容に応じてファイル・ディレクトリを検索します。
システム開発業務でよく使う検索条件については、後述で詳しくまとめています。

findコマンドの基本的な使い方

ファイル名で検索する

-name を指定することで、ファイル名やディレクトリ名を条件に検索できます。

$ find . -name "error.log"
./logs/error.log

上記の例では、カレントディレクトリ配下を対象に、
error.log という名前のファイルやディレクトリを検索します。

筆者も、手順書に記載されている設定ファイルの配置場所が分からず、
サーバー内を探す必要が出たときに -name で調べることがあります。

なお、検索開始ディレクトリは省略可能で、
省略した場合、現在のディレクトリ(.)が検索対象になります。

更新日時で検索する

指定した日時を条件に検索できます。
検索条件を指定するオプションは、以下のとおりです。

検索条件内容
-mtimeファイルの最終更新日時
-ctimeinode情報(権限・所有者など)が変更された日時
-atimeファイルの最終参照日時
$ find . -mtime -7
./logs/access.log
./config/app.conf

このコマンドを実行すると、カレントディレクトリ配下から
過去7日以内に更新されたファイルやディレクトリが一覧表示されます。

日時の指定は、以下のとおりです。

指定方法意味
-77日以内
7ちょうど7日前
+7最終更新から7日を超えた(=8日以上前)

例えば、+7 と指定した場合、古いログや一時ファイルなど、
最終更新から8日が経過したファイルを洗い出したいときに使うことができます。

また、-mmin-cmin-amin と指定することで、
条件を分単位で検索することができます。

ファイルサイズで検索する

-size を指定することで、ファイルサイズを条件に検索できます。

$ find . -size +100M
./logs/debug.log
./backup/db_backup.tgz

このコマンドを実行すると、
カレントディレクトリ配下にある100MBを超えるファイルが一覧表示されます。

ファイルサイズの指定は、以下のとおりです。

指定方法意味
-100M99MiB(約103.8MB)以下
100M99MiBを超え、100MiB以下
+100M99MiBを超える

find の -size は、ファイルサイズを単位ごとに切り上げて判定します。
そのため、「99.5MiBのファイル」のように単位の境界をまたぐ場合、
直感的な「100MiB未満/以上」の区切りとはズレる点に注意してください。

例えば、-size -100M は「100MiB未満」を意図して使っても、
99MiBを超えるファイルはヒットしません。

また、サイズの単位はM(MiB)のほかに、k(KiB)、G(GiB)などを指定することもできます。
k は小文字で、M・G は大文字で指定する点に注意してください。

ファイルかディレクトリかを条件に検索する

-type を指定することで、検索対象をファイルかディレクトリかで絞り込むことができます。

$ find . -type f -name "*.log"
./logs/access.log
./logs/error.log
./logs/debug.log

上記の例では、カレントディレクトリ配下を対象に、
拡張子が .log のファイル(ディレクトリを除く)のみを検索します。

-type の指定方法は以下のとおりです。

指定方法意味
f通常ファイル
dディレクトリ
lシンボリックリンク

-name だけで検索すると、同名のディレクトリまで結果に含まれてしまうことがあります。

例えば logs という名前のファイルとディレクトリが両方存在する環境では、
-type を付けることで、ファイルやディレクトリを区別して検索できます。

検索範囲を制限して検索する

-maxdepth を指定することで、検索するディレクトリの階層に上限を設定することができます。

$ find . -maxdepth 2 -name "error.log"
./logs/error.log

上記の例では、カレントディレクトリ配下を対象に、
2階層目までの範囲で error.log という名前のファイルやディレクトリを検索します。

-maxdepth はグローバルオプションのため、
検索開始ディレクトリの直後、他の検索条件(-name など)より前に書く必要があります。

$ find . -name "error.log" -maxdepth 2    // 誤り:警告が出る
$ find . -maxdepth 2 -name "error.log"    // 正しい順序

順序を誤ると find が警告メッセージを出すため、
-maxdepth は必ず検索開始ディレクトリの直後に書くようにします。

findの検索結果に対してコマンドを実行する

-exec を指定することで、findで見つかったファイルに対してコマンドを実行できます。

$ find . -name "*.log" -exec [findで見つかったファイルに対して実行したいコマンド] {} \;

コマンドの後ろに指定している {} は find で見つかったファイル名が入る位置、
\; は -exec の終了を示しています。

例えば、カレントディレクトリ配下の .log ファイルを対象に、
「error」を含む行を grep で検索したい場合は以下のようにコマンドを実行します。

$ find . -name "*.log" -exec grep "error" {} \;

上記は、find で見つかったファイルを grep に1件ずつ渡し、grep の処理をしています。

なお、-exec の末尾は ; のほかに + を指定することもできます。

$ find . -name "*.log" -exec grep "error" {} \;
$ find . -name "*.log" -exec grep "error" {} +

; は見つかったファイル1件ごとにコマンドを起動するのに対し、
+ は見つかったファイルをまとめて1回のコマンド実行に渡します。

対象ファイル数が数百〜数千件になるログ調査などでは、
; だとコマンドの起動回数が増えて処理が遅くなるため、
+ を使ったほうが処理時間を短縮できます。

一方で、複数のファイルを同時に処理できないコマンドでは、\; を使います。

ログファイルの調査など、
大量のファイルの中から特定の文字列が含まれる箇所を確認したいときに役立ちます。

findコマンド実行時によくあるエラー

システムディレクトリを対象に検索すると、
一般ユーザー権限では以下のような Permission denied が大量に出力されることがあります。

$ find / -name "*.conf"
find: '/root': Permission denied
find: '/var/lib/private': Permission denied
/etc/app/app.conf

これは権限のないディレクトリにアクセスしようとしたときに出るエラーで、
検索処理自体は中断されず、権限があるディレクトリの結果は表示されます。

エラーメッセージを非表示にしたい場合は、標準エラー出力を /dev/null に捨てます。

$ find / -name "*.conf" 2>/dev/null
/etc/app/app.conf

findコマンドの実用例

ここまで紹介した条件は単体でも使えますが、組み合わせることでより実務的な調査ができます。

肥大化したファイルを探す

例えば、ディスク容量が急増した際の原因調査では、-size と -exec を組み合わせることで、
大きいファイルを対象に各ファイルのサイズを確認することができます。

$ find / -size +500M -exec du -h {} \; 2>/dev/null
1.2G    /var/log/app/debug.log

このように、-size と -exec、エラー抑制を組み合わせることで、
権限エラーに邪魔されずに容量の大きいファイルだけを一覧化できます。

まとめ

find コマンドは、ファイル名や更新日時、ファイルサイズなどの条件を指定して、
目的のファイルやディレクトリを検索できるコマンドです。

単体のオプションだけでなく、複数の条件を組み合わせることで、
大量のファイルの中から目的のファイルを短時間で特定できるようになります。

また、ファイル本記事で紹介したファイル検索だけでなく、
ファイル内に含まれる文字列で検索する grep コマンドも、
ログファイルや設定ファイルの確認などで活用する機会が多いコマンドです。

grep コマンドについても詳しく知りたい方は、以下の記事も参考にしてみてください。
【Linux】grepコマンドの使い方|システム開発でよく使うオプションまとめ

参考リンク

GNU findutils 日本語マニュアル:findコマンド

コメント