こんにちは、インフラエンジニアのryuです。
今回は、Linuxでファイルやディレクトリを検索するときに使う find コマンドについて解説します。
Linuxを使っていると、
「設定ファイルをどこに置いたか分からない」 「100MB以上ある大きなファイルを探したい」 「昨日更新されたログだけ見つけたい」
という場面があります。
そんなときに使うのが find コマンドです。
find はファイル名だけでなく、
- ファイルかディレクトリか
- 更新日時
- ファイルサイズ
- 所有者
- パーミッション
など、さまざまな条件を組み合わせて検索できます。
この記事では、Linux初心者向けに find の基本構文から、-name、-type、-mtime、-size、-user、-exec まで、実務でもよく使う検索方法を順番に解説します。
Linuxでファイル検索をするならfindコマンド¶
Linuxでファイルやディレクトリを検索するときは、
find
を利用します。
基本的な書き方は、
find [検索を開始する場所] [検索条件]
です。
例えば、現在のディレクトリ以下から test.txt を探すなら、
find . -name "test.txt"
です。
ここにある、
.
は「カレントディレクトリ」を意味します。
つまり、
現在のディレクトリ
↓
その配下を再帰的に探す
↓
test.txt という名前を検索
という動作です。
まず検索用のファイルを作ってみる¶
実際に動かしながら確認してみましょう。
touch test{1..10}.txt
ls -la
これで、
test1.txt
test2.txt
...
test10.txt
というファイルを作成できます。

作成できたら、次のコマンドを実行します。
find . -name "test1.txt"
すると、
./test1.txt
のように表示されます。

-name でファイル名を検索する¶
-name は、名前を条件に検索するときに使います。
find . -name "test.txt"
完全一致ではなく、名前の一部だけ分かっている場合はワイルドカードを利用できます。
find . -name "*test*"
* は任意の文字列に一致します。
例えば、
mytest.txt
test1.log
old-test.conf
などが検索対象になります。
ここで重要なのは、*test* を引用符で囲むことです。
find . -name "*test*"
とします。
引用符を付けないと、* が find に渡る前にシェル側で展開される場合があるためです。
大文字・小文字を区別しないなら -iname¶
Linuxでは通常、ファイル名の大文字・小文字を区別します。
例えば、
Test.txt
test.txt
TEST.txt
は別の名前です。
大文字・小文字を区別せず検索したいなら、
find . -iname "test.txt"
を使います。
一部一致なら、
find . -iname "*test*"
です。
ファイルだけ検索するなら -type f¶
find はファイルだけでなくディレクトリなども検索します。
例えば、ディレクトリを作ってみましょう。
mkdir testdir
find . -name "*test*"

すると、ファイルだけでなく testdir も表示されます。
ファイルだけに絞りたい場合は、
find . -type f -name "*test*"
とします。
-type f の f は通常のファイルです。
ディレクトリだけ検索するなら -type d¶
ディレクトリだけなら、
find . -type d -name "*test*"
です。
よく使うファイル種別は次のとおりです。
| 条件 | 意味 |
|---|---|
-type f |
通常ファイル |
-type d |
ディレクトリ |
-type l |
シンボリックリンク |
「設定ファイルを探したい」という場合は -type f を付けると、余計なディレクトリを除外できます。
検索する場所を指定する¶
find は検索開始位置が重要です。
現在のディレクトリ以下なら、
find .
/etc 以下なら、
find /etc -name "*.conf"
ユーザーのホームディレクトリ以下なら、
find ~ -name "*.txt"
です。
Linux全体から探すために、
find / -name "httpd.conf"
とすることもできますが、権限がないディレクトリでは、
Permission denied
が大量に表示される場合があります。
管理者権限が必要な調査なら、
sudo find / -name "httpd.conf"
を利用することもあります。
ただし、何でも sudo で検索する必要はありません。
まず検索範囲をできるだけ狭くする方が、速く安全に調査できます。
検索する階層を制限する -maxdepth¶
例えば現在のディレクトリ直下だけを探したい場合は、
find . -maxdepth 1 -type f
とします。
通常の find は配下を再帰的に検索します。
ディレクトリ階層が非常に深い場合、必要以上に広い範囲を検索すると時間がかかります。
「どこまで探す必要があるのか」が分かっている場合は -maxdepth を利用すると便利です。
更新日時で検索する¶
運用では、
「最近更新されたファイルを探したい」
という場面がよくあります。
例えば、過去10分以内に更新されたファイルを探すなら、
find . -type f -mmin -10
です。
-mmin は更新時刻を「分」で指定します。
過去1日以内に更新されたファイルなら、
find . -type f -mtime -1
のように -mtime を使えます。
初心者が混乱しやすいのが + と - です。
例えば、
-mmin -10
なら「10分未満」。
-mmin +10
なら「10分より前」のように考えます。
「ちょうど10分前」という意味ではないため注意してください。
基準となるファイルより新しいものを探す¶
あるファイルより後に更新されたファイルを探したい場合は、
find . -newer reference.txt
を利用できます。
例えば、デプロイ前に、
touch /tmp/deploy-start
として基準ファイルを作っておき、その後、
find /var/www -type f -newer /tmp/deploy-start
とすれば、その時刻より後に更新されたファイルを探せます。
ファイルサイズで検索する¶
100MBより大きいファイルを探すなら、
find . -type f -size +100M
です。
1MB未満なら、
find . -type f -size -1M
のように指定できます。
代表的な単位には、
c バイト
k KiB相当
M MiB相当
G GiB相当
などがあります。
ディスク容量が足りないときに、
find /var -type f -size +1G
のように大きなファイルを探すことがあります。
ただし、ファイルを見つけたからといって、すぐ削除しないでください。
ログ、DB、アプリケーションデータなど重要なファイルの可能性があります。
所有者で検索する¶
特定ユーザーが所有しているファイルを探すなら、
find /var/www -user www-data
です。
グループなら、
find /var/www -group www-data
とします。
「デプロイしたファイルだけ所有者がおかしい」
といったトラブル調査で便利です。
パーミッションで検索する¶
例えば、モードが完全に 777 のファイルやディレクトリを検索するなら、
find . -perm 0777
です。
指定した権限ビットをすべて持つものを探す場合など、-perm には複数の指定方法があります。
権限調査では非常に便利ですが、最初は、
find . -perm 0777
のような完全一致から覚えると分かりやすいでしょう。
Linuxの権限についてはこちらで詳しく解説しています。
Linuxのファイル権限とは?chmodの数字・rwx・Permission deniedを解説
複数条件を組み合わせる¶
find の強みは、複数条件を組み合わせられることです。
例えば、
find /var/log -type f -name "*.log" -size +100M
なら、
/var/log以下
+
通常ファイル
+
.logで終わる
+
100MBより大きい
という条件です。
過去1日以内に更新されたログなら、
find /var/log -type f -name "*.log" -mtime -1
とできます。
実務では、1つのオプションだけでなく複数条件を組み合わせることが多いです。
OR条件を使う¶
例えば、.log または .txt を探したい場合は、
find . -type f \( -name "*.log" -o -name "*.txt" \)
とします。
-o がORです。
括弧はシェルに解釈されないよう、
\(
\)
とエスケープしています。
少し難しいので、最初は「複数条件も書ける」と覚えておけば十分です。
検索したファイルにコマンドを実行する -exec¶
find では、見つけたファイルに対して別のコマンドを実行できます。
例えば、
find . -type f -name "*.log" -exec ls -lh {} \;
とすると、見つけたログファイルへ ls -lh を実行します。
{} の部分に、検索で見つかったパスが入ります。
ただし、-exec と削除コマンドを組み合わせる場合は特に注意してください。
例えば、
find . -type f -name "*.tmp" -delete
や rm を使えばファイルを削除できますが、条件を間違えると大量のファイルを失う可能性があります。
最初は必ず、
find . -type f -name "*.tmp"
だけを実行し、対象を確認してから削除処理へ進みましょう。
find と grep の違い¶
初心者のうちは find と grep を混同しやすいです。
大まかには、
find
→ ファイル名や属性を探す
grep
→ ファイルの中身にある文字列を探す
と考えます。
例えば、
find /etc -name "*.conf"
は設定ファイルそのものを探します。
一方、
grep -R "Listen 80" /etc
は、ファイルの中にある文字列を探します。
「ファイルを探したいのか」「ファイル内の文字を探したいのか」を最初に考えましょう。
locate との違い¶
Linuxには locate という検索コマンドもあります。
locate は事前に作成されたデータベースからファイル名を検索するため、高速に検索できる場合があります。
一方、find は実際のディレクトリツリーをたどりながら検索します。
そのため、
find
→ 条件を細かく指定して現在の状態を検索
locate
→ ファイル名を高速に探す
という違いがあります。
Linux初心者なら、まず find をしっかり使えるようになれば問題ありません。
findコマンドは実際に条件を変えながら覚える¶
find はオプションが多いため、一覧を全部暗記する必要はありません。
まずは、
find . -name "*.txt"
find . -type f
find . -type d
find . -mmin -10
find . -size +100M
あたりを実際に試してみるのがおすすめです。
InfraAcademyでは、Linuxコマンドをブラウザ上で実行しながら学習できます。
「本を読んでもコマンドがなかなか覚えられない」という方は、自分でファイルを作成し、条件を変えて検索してみると理解しやすくなります。
Linuxのfindコマンドまとめ¶
今回は、Linuxでファイルを検索する find コマンドについて解説しました。
基本構文は、
find [検索開始位置] [条件]
です。
まず覚えたいのは次のコマンドです。
find . -name "test.txt"
find . -iname "*test*"
find . -type f
find . -type d
find . -mmin -10
find . -size +100M
find . -user username
find は条件を組み合わせることで、実務のトラブル調査でもかなり役立ちます。
検索範囲をむやみに / へ広げるのではなく、
どこにありそうか → 何を条件に絞れるか
と考えながら使うのがポイントです。
あわせて読みたい



