Linuxのファイル検索方法まとめ|find・locateコマンドの使い方と使い分け

コマンドリファレンス

Linux でファイル検索をするなら、まず覚えるべきは find コマンドです。名前・拡張子・サイズ・更新日時などの条件を柔軟に組み合わせて、指定ディレクトリ以下をリアルタイムに走査できます。ファイル名だけを高速に探したいなら locate、ファイルの中身(文字列)を探したいなら grep というように、目的によって使うコマンドが変わります。本記事では、Linux でのファイル検索方法を目的別に整理し、find コマンドの基本構文・主要オプション・実行例・注意点から、locate との使い分けまでまとめて解説します。

  1. 結論:目的別のファイル検索コマンド早見表
  2. Linux find コマンドとは
  3. find と locate の違い
  4. find コマンドの基本構文
    1. カレントディレクトリ以下をすべて表示
    2. 指定ディレクトリ以下を検索
  5. ファイル名で検索(-name)
  6. 拡張子で検索
  7. ファイルタイプで検索(-type)
  8. 更新日時で検索(-mtime / -newer)
    1. -mtime:日数指定
    2. -newer:特定ファイルより新しい
    3. -mmin:分数指定
  9. サイズで検索(-size)
  10. 複数条件の組み合わせ
  11. find の応用:-exec と xargs との連携
    1. -exec:見つかったファイルにコマンドを実行
    2. grep との連携:ファイル内を検索
    3. xargs との連携:高速な一括処理
  12. find コマンドを使うときの注意点
    1. ワイルドカードは必ずクォートする
    2. -exec rm など破壊的な操作は事前確認してから実行する
    3. 権限エラー(Permission denied)を抑制する
    4. 大規模ディレクトリでは -maxdepth で探索範囲を絞る
  13. locate コマンドの基本
    1. インストール
    2. データベースの更新(updatedb)
    3. 基本的な使い方
    4. 主なオプション
  14. find と locate の使い分けまとめ
  15. ファイルの中身(文字列)を検索する(grep)
  16. find コマンドに関するよくある質問
    1. find コマンドの使い方は?
    2. Linux の find コマンドとは?
    3. Mac で find コマンドを使うには?
    4. find コマンドのオプション一覧は?
    5. Linux でファイルを検索するにはどうすればいいですか?
    6. ファイルの中身(文字列)を検索するには?
    7. find より速いファイル検索コマンドはありますか?
  17. よく使うコマンドパターン集
  18. 関連記事

結論:目的別のファイル検索コマンド早見表

まず結論です。Linux でファイルを探すときは、何を探したいかでコマンドを使い分けます。

やりたいこと使うコマンドコマンド例
名前・サイズ・更新日時など条件で検索したいfindfind . -name "*.log"
ファイル名だけをとにかく高速に探したいlocatelocate nginx.conf
ファイルの中身(文字列)を検索したいgrepgrep -r "keyword" .
find より速く・シンプルな書き方で探したいfdfd pattern

迷ったら、まず標準搭載の find コマンドを使うのが基本です。以降で、それぞれの具体的な使い方を解説します。

Linux find コマンドとは

find はディレクトリツリーを再帰的にたどり、ファイル名・種類・サイズ・更新日時などの条件に一致するファイルやディレクトリを探すコマンドです。ほとんどのLinuxディストリビューションやmacOSに標準搭載されており、追加インストールなしですぐに使えます。検索と同時に -exec オプションで見つかったファイルにコマンドを実行できるのも大きな特徴です。

find と locate の違い

比較項目findlocate
検索方式ディレクトリをリアルタイム走査事前作成したDBを参照
速度遅い(ファイル数に比例)高速
最新状態常に最新DB更新(updatedb)が必要
条件指定豊富(サイズ・日時・権限など)ファイル名・パスのみ
インストール標準搭載別途インストールが必要な場合あり

ファイル名だけを素早く探したい場合は locate、サイズや日時などの条件を細かく指定したい場合や作成したばかりのファイルを探す場合は find を使います。

find コマンドの基本構文

find [検索パス] [条件] [アクション]

検索パスを省略するとカレントディレクトリ以下を再帰的に検索します。カレントディレクトリの中身を一覧表示したいだけの場合は「ls – ディレクトリやファイルの一覧を表示するコマンド」の方がシンプルです。条件で絞り込んだり、サブディレクトリまで再帰的に探したりしたい場合に find を使います。

カレントディレクトリ以下をすべて表示

find .

指定ディレクトリ以下を検索

find /var/log

ファイル名で検索(-name)

-name オプションでファイル名を指定します。ワイルドカード(*)が使えます。

# "config.txt" というファイルを探す
find / -name "config.txt"

# "access" を含むファイルを探す
find /var/log -name "*access*"

大文字・小文字を区別せず検索するには -iname を使います。

# README.md、readme.md、Readme.md なども一致
find . -iname "readme.md"

拡張子で検索

-name*.拡張子 のパターンを指定します。

# .log ファイルをすべて探す
find /var/log -name "*.log"

# .sh ファイルをすべて探す
find /home -name "*.sh"

# .conf ファイルを探す
find /etc -name "*.conf"

ファイルタイプで検索(-type)

-type オプションでファイルの種類を絞り込めます。

意味
f通常ファイル
dディレクトリ
lシンボリックリンク
# ディレクトリのみ表示
find . -type d

# 通常ファイルのみ表示
find . -type f

# シンボリックリンクのみ表示
find . -type l

ファイル名と組み合わせて使うと、特定の拡張子を持つ通常ファイルだけを取得できます。

find . -type f -name "*.log"

更新日時で検索(-mtime / -newer)

-mtime:日数指定

指定意味
-mtime -124時間以内に更新されたファイル
-mtime +77日より前に更新されたファイル
-mtime 1ちょうど1日前に更新されたファイル
# 24時間以内に更新されたファイル
find . -mtime -1

# 7日以上前のログファイル
find /var/log -name "*.log" -mtime +7

-newer:特定ファイルより新しい

# reference.txt より新しいファイルを探す
find . -newer reference.txt

-mmin:分数指定

# 60分以内に更新されたファイル
find . -mmin -60

サイズで検索(-size)

単位意味
cバイト
kキロバイト(1KB = 1024バイト)
Mメガバイト
Gギガバイト
# 100MB より大きいファイルを探す
find / -size +100M

# 1KB 未満の空に近いファイル
find . -size -1k

# ちょうど 0 バイトのファイル(空ファイル)
find . -size 0c

複数条件の組み合わせ

複数の条件は AND(デフォルト)、-o で OR、! で NOT になります。

# .log かつ 7日以上前のファイル(AND)
find /var/log -name "*.log" -mtime +7

# .log または .txt のファイル(OR)
find . -name "*.log" -o -name "*.txt"

# .log 以外のファイル(NOT)
find . ! -name "*.log"

find の応用:-exec と xargs との連携

-exec:見つかったファイルにコマンドを実行

-exec オプションで、見つかった各ファイルに対してコマンドを実行できます。{} がファイル名のプレースホルダー、末尾の ; がコマンドの終端です。

# 7日以上前の .log ファイルを削除
find /var/log -name "*.log" -mtime +7 -exec rm {} ;

# 見つかったファイルの詳細を表示
find . -name "*.sh" -exec ls -la {} ;

# 見つかった .sh ファイルの実行権限をまとめて付与
find . -name "*.sh" -exec chmod +x {} ;

権限の数値指定や chmod の詳しいオプションは「chmodコマンドの使い方|755・644・777の数値の意味とrwx設定ガイド」を参照してください。-exec rm {} ; で一括削除する前に、まず -exec ls-print で対象を確認する習慣が事故防止につながります。rm 単体の使い方・オプションは「Linuxでファイルを削除する方法|rmコマンドの使い方」で解説しています。

grep との連携:ファイル内を検索

find でファイルを絞り込み、grep で内容を検索するパターンは実務でよく使います。

# .sh ファイルの中から "echo" を含む行を表示
find . -name "*.sh" -exec grep -H "echo" {} ;

詳しい grep の使い方は「grep コマンド完全ガイド|テキスト検索の基本・正規表現・除外・複数条件」を参照してください。

xargs との連携:高速な一括処理

-exec はファイルごとにプロセスを起動するため、ファイル数が多い場合は xargs を使うと高速です。

# find の結果を xargs に渡して grep
find . -name "*.log" | xargs grep "ERROR"

# 空白を含むファイル名に対応(-print0 と -0 を使う)
find . -name "*.log" -print0 | xargs -0 grep "ERROR"

ファイル名に空白や改行が含まれる場合の安全な処理方法は「NUL 安全の処理系|find -print0 | xargs -0」で詳しく解説しています。詳しい xargs の使い方は「xargs コマンド|標準入力を引数に渡す・ find / grep との連携パターン」を、findxargs を組み合わせた実務レシピは「findコマンドとxargsの組み合わせ術:ファイル検索から一括処理(exec)までの実務レシピ」を参照してください。

find コマンドを使うときの注意点

ワイルドカードは必ずクォートする

-name *.txt のようにワイルドカードをクォートせずに書くと、find に渡る前にシェルがカレントディレクトリのファイル名へ展開してしまい、意図した検索にならないことがあります。-name "*.txt" のように必ずダブルクォートで囲んでください。

# NG:シェルが *.txt を展開してから find に渡すため、
# カレントディレクトリに一致ファイルが無いと「そのようなファイルはありません」等のエラーになる
find . -name *.txt

# OK:クォートして find 自身にワイルドカードを解釈させる
find . -name "*.txt"

-exec rm など破壊的な操作は事前確認してから実行する

-exec rm {} ; は確認なしで即座に削除します。誤って対象範囲を広く指定すると取り返しがつかないため、まず -exec ls -la {} ;-print で対象ファイルを一覧表示し、意図した範囲だけが含まれているか確認してから rm に置き換える習慣をつけてください。

# 1. まず対象を確認
find /var/log -name "*.log" -mtime +7

# 2. 意図した範囲だけであることを確認してから削除
find /var/log -name "*.log" -mtime +7 -exec rm {} ;

権限エラー(Permission denied)を抑制する

一般ユーザーで / やシステムディレクトリ全体を検索すると、権限のないディレクトリで大量の find: 'xxx': Permission denied が出力され、本来の検索結果が見づらくなります。標準エラー出力を /dev/null に捨てると結果だけを確認できます。

# 権限エラーのメッセージを非表示にする
find / -name "nginx.conf" 2>/dev/null

大規模ディレクトリでは -maxdepth で探索範囲を絞る

find はディレクトリツリー全体を走査するため、ファイル数が多い環境では時間がかかります。探索する階層があらかじめ分かっている場合は -maxdepth で深さを制限すると高速化できます。

# カレントディレクトリ直下(1階層)のみ検索
find . -maxdepth 1 -type f

locate コマンドの基本

インストール

多くのディストリビューションでは mlocate または plocate パッケージに含まれます。

# Ubuntu / Debian
sudo apt install plocate

# RHEL / CentOS / AlmaLinux
sudo dnf install mlocate

データベースの更新(updatedb)

locate はインデックスDBを参照するため、検索前に updatedb でDBを更新します。通常は cron で自動実行されますが、直前に作成したファイルを探す場合は手動で実行します。

sudo updatedb

基本的な使い方

# "nginx" を含むパスを検索
locate nginx

# "nginx.conf" を検索
locate nginx.conf

出力例:

/etc/nginx/nginx.conf
/usr/share/doc/nginx/nginx.conf

主なオプション

オプション説明使用例
-i大文字・小文字を区別しないlocate -i README
-cマッチ件数のみ表示locate -c "*.conf"
-l N最大 N 件表示locate -l 10 nginx
-r正規表現で検索locate -r ".log$"
-e存在するファイルのみ表示locate -e nginx.conf
# 大文字小文字を区別せず検索
locate -i readme

# 件数を確認
locate -c "*.conf"

# 存在するファイルのみ(DB更新後に削除されたファイルを除く)
locate -e nginx.conf

find と locate の使い分けまとめ

用途おすすめコマンド
ファイル名で高速検索したいlocate
作成・更新したばかりのファイルを探すfind
拡張子・サイズ・日時などの条件で検索find
見つけたファイルに対してコマンドを実行find -exec / find | xargs
ファイル名のパターンだけ分かっているlocate

ファイルの中身(文字列)を検索する(grep)

findlocate はファイル名やファイルの属性で探すコマンドで、ファイルの中身(テキストの内容)までは検索できません。設定ファイルの中から特定の文字列を含む行を探したい場合は grep を使います。

# カレントディレクトリ以下を再帰的に検索し、"keyword" を含む行を表示
grep -r "keyword" .

# ファイル名も一緒に表示し、大文字小文字を区別しない
grep -rin "keyword" .

「ファイル名で絞り込んでから中身を検索する」場合は findgrep を組み合わせます(本記事の「grep との連携:ファイル内を検索」を参照)。grep のオプションや正規表現の詳しい使い方は「grep コマンド完全ガイド|テキスト検索の基本・正規表現・除外・複数条件」で解説しています。

find コマンドに関するよくある質問

find コマンドの使い方は?

find [検索パス] [条件] [アクション] の構文で使います。検索パスを起点にディレクトリを再帰的にたどり、-name(ファイル名)、-type(種類)、-mtime(更新日時)、-size(サイズ)などの条件で絞り込み、-exec で見つかったファイルにコマンドを実行できます。詳しくは本記事の「find コマンドの基本構文」以降の各セクションを参照してください。

Linux の find コマンドとは?

指定したディレクトリ以下をリアルタイムに走査し、名前・種類・サイズ・更新日時などの条件でファイルやディレクトリを検索するLinux/Unix標準コマンドです。事前にデータベースを作成する locate と異なり、常に最新のファイル状態を反映して検索できます。

Mac で find コマンドを使うには?

macOS にはBSD版の find が標準搭載されているため、追加インストールなしでターミナルからそのまま使えます。-name-type など基本オプションはLinux(GNU find)と共通ですが、-printf などGNU find固有のオプションは使えません。GNU findと同じ挙動が必要な場合は、Homebrewで brew install findutils を実行すると gfind コマンドとして利用できます。

find コマンドのオプション一覧は?

代表的なオプションは -name / -iname(名前検索)、-type(種類)、-mtime / -mmin / -newer(更新日時)、-size(サイズ)、-exec(アクション実行)、-print0(NUL区切り出力)です。それぞれの使用例は本記事の該当セクションにまとめています。

Linux でファイルを検索するにはどうすればいいですか?

名前・サイズ・更新日時などの条件で探すなら標準搭載の find コマンド、ファイル名だけをとにかく高速に探すなら locate、ファイルの中身(文字列)を探すなら grep を使います。詳しくは本記事冒頭の「結論:目的別のファイル検索コマンド早見表」を参照してください。

ファイルの中身(文字列)を検索するには?

grep -r "検索文字列" . のように grep を使います。find でファイル名を絞り込んでから -exec grepxargs grep と連携させると、特定の拡張子のファイルだけを対象に内容検索できます。詳しくは本記事の「ファイルの中身(文字列)を検索する(grep)」を参照してください。

find より速いファイル検索コマンドはありますか?

ファイル名の検索だけであれば、DBを参照する locate が高速です。また find の代替として、より直感的な書き方で高速に動作する fd コマンドもよく使われます。

よく使うコマンドパターン集

# ファイル名で検索
find / -name "nginx.conf" 2>/dev/null

# 拡張子で検索
find . -name "*.py"

# 7日以上前のログを削除
find /var/log -name "*.log" -mtime +7 -exec rm {} ;

# 100MB 以上のファイルを一覧表示
find / -size +100M -type f 2>/dev/null

# 24時間以内に更新されたファイル
find . -mtime -1 -type f

# .sh ファイルの中から特定の文字列を検索
find . -name "*.sh" | xargs grep "#!/bin/bash"

# ファイル名を高速検索(locate)
locate nginx.conf

# DB を更新してから検索
sudo updatedb && locate newfile.txt
Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント