Linux でファイルを探すときに使うコマンドが find と locate です。find はディレクトリをリアルタイムに走査し、名前・拡張子・サイズ・更新日時などの条件を柔軟に組み合わせて検索できます。locate はあらかじめ作成したデータベースから高速に検索できますが、最新状態を反映するには updatedb が必要です。
find と locate の違い
| 比較項目 | find | locate |
|---|---|---|
| 検索方式 | ディレクトリをリアルタイム走査 | 事前作成したDBを参照 |
| 速度 | 遅い(ファイル数に比例) | 高速 |
| 最新状態 | 常に最新 | DB更新(updatedb)が必要 |
| 条件指定 | 豊富(サイズ・日時・権限など) | ファイル名・パスのみ |
| インストール | 標準搭載 | 別途インストールが必要な場合あり |
ファイル名だけを素早く探したい場合は locate、サイズや日時などの条件を細かく指定したい場合や作成したばかりのファイルを探す場合は find を使います。
find コマンドの基本構文
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 -1 | 24時間以内に更新されたファイル |
-mtime +7 | 7日より前に更新されたファイル |
-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 {} ;
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"
詳しい xargs の使い方は「xargs コマンド|標準入力を引数に渡す・ find / grep との連携パターン」を参照してください。
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 |
よく使うコマンドパターン集
# ファイル名で検索
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

コメント