find コマンド / locate|Linuxでファイルを検索する方法

未分類

Linux でファイルを探すときに使うコマンドが findlocate です。
find はディレクトリをリアルタイムに走査し、名前・拡張子・サイズ・更新日時などの条件を柔軟に組み合わせて検索できます。locate はあらかじめ作成したデータベースから高速に検索できますが、最新状態を反映するには updatedb が必要です。

find と locate の違い

比較項目findlocate
検索方式ディレクトリをリアルタイム走査事前作成した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 -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 {} ;

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
Bash玄

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

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

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

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

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

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

Bash玄をフォローする

コメント