ファイル検索の極意:findとlocate、状況に応じた使い分け
「あの設定ファイル、どこに行ったっけ?」「さっき作ったばかりのログファイルが見当たらない!」――Linuxを管理・運用していると、ファイルが行方不明になり、途方に暮れる経験は誰にでもあるのではないでしょうか。ls -lcdで手当たり次第探し回ったことはありませんか? そんな「迷子ファイル」を見つけ出すための強力なツールが、findコマンドとlocateコマンドです。

この記事では、Linuxでファイルを検索するための主要なコマンドであるfindlocateについて、それぞれの特徴、メリット・デメリット、そして具体的な使用例を交えながら、どのような状況でどちらのコマンドを使うべきかを詳しく解説します。これらのコマンドをマスターすれば、あなたのシステム管理はもっと効率的になるはずです。
この記事でわかること
  • findコマンドの基本的な使い方と、リアルタイム検索の利点、そして応用的な使い方
  • locateコマンドの基本的な使い方と、高速検索の利点、そして知っておくべき注意点
  • findlocateの使い分けのポイント
  • 状況に応じたファイル検索の具体例と、よくある間違い

ファイルをリアルタイムに探す:findコマンド

findコマンドは、指定したディレクトリ以下をリアルタイムに検索するコマンドです。ファイル名だけでなく、最終更新時刻、ファイルサイズ、パーミッションなど、様々な条件で詳細な検索が可能です。検索には時間がかかりますが、常に最新の状態を反映した結果が得られます。

この状況で困ったらコレ!
  • 「たった今作成したばかりのファイルを、名前の一部だけ覚えていて探したい」
  • 「特定のディレクトリにある、1週間以内に更新された設定ファイルを見つけたい」
  • 「特定の拡張子を持つファイルをすべて削除したい、または権限を変更したい」
コマンド例
# 現在のディレクトリ以下で「.conf」で終わるファイルを検索
find . -name "*.conf"

# /var/log以下で、過去7日以内に更新されたファイルを検索
find /var/log -mtime -7

# /tmp以下で、空のディレクトリを検索して削除
find /tmp -type d -empty -delete
オプション 意味
-name ファイル名を指定(ワイルドカードが利用可能)
-type ファイルの種類を指定(f:ファイル, d:ディレクトリ)
-mtime 最終更新時刻を指定(+N:N日前以前, -N:N日以内)
-size ファイルサイズを指定(+NC:Nバイト以上, -NC:Nバイト以下)
-delete 検索したファイルを削除(注意して使用!
より高度なfindの使い方(ワンポイント)

findコマンドは、さらに複雑な条件を指定したり、検索結果に対して別のコマンドを実行したりすることも可能です。

  • 「.log以外のファイルだけ検索したい」 ! (感嘆符) を使うことで、条件の否定ができます。
    find . ! -name "*.log"
  • 「検索したファイルに一括でコマンドを実行したい」 -execオプションを使うと、見つけたファイルを引数として任意のコマンドを実行できます。{}は見つかったファイル名に置き換えられ、;(セミコロン)の前に\(バックスラッシュ)を付けてエスケープすることで、シェルが特殊文字と認識しないようにします。
    # 現在のディレクトリ以下にあるすべての.shファイルに実行権限を付与
    find . -name '*.sh' -exec chmod +x {} \;
よくある間違いポイント

find . -name *.conf のようにワイルドカードをクォートせずに使うと、シェルが先に展開してしまい、意図しない結果になることがあります。常に find . -name '*.conf' のようにクォートで囲みましょう。 また、ファイル名やパスにスペースが含まれる場合も、シングルクォートで囲むことを推奨します。


高速にファイルを検索する:locateコマンド

locateコマンドは、あらかじめ作成されたデータベース(通常はupdatedbコマンドで更新)を参照してファイルを検索します。そのため、非常に高速に結果を返しますが、データベースが更新されていない場合は最新の状態を反映しません。

この状況で困ったらコレ!
  • 「システム全体のどこかに存在するコマンドや設定ファイルの場所を、とにかく早く知りたい」
  • 「昨日まで使っていたコマンドのパスが思い出せないが、大体の名前は覚えている」
コマンド例
# 「ssh_config」という文字列を含むファイルを検索
locate ssh_config

# 「nginx」という文字列を含むファイルを大文字小文字を区別せずに検索
locate -i nginx
オプション 意味
-i 大文字小文字を区別しない
-b パスの basename のみをマッチさせる
データベースの更新と注意点

locateコマンドが参照するデータベースは、通常は日次で自動更新されますが、手動で更新することも可能です。

sudo updatedb

このコマンドを実行すると、システム全体のファイル情報をスキャンしてデータベースを更新します。環境によっては実行に時間がかかる場合があります。

locateでファイルが見つからない・消したはずのファイルが残る理由

locateはファイルリストのデータベースを使っているため、データベースが古いと、既に削除したファイルが表示される、または新規に作成したばかりのファイルが検索できないことがあります。これは、データベースの更新と実際のファイルシステムの状態にタイムラグがあるためです。こうした場合はsudo updatedbでデータベースを更新してから再度検索してください。

なお、/tmp/proc/sysなどの一時的なファイルシステムや特殊なディレクトリは、通常/etc/updatedb.confという設定ファイルでデータベースの対象から除外されています。


まとめ

一般的に、「今すぐ、特定の条件でファイルを詳細に検索したい、または検索結果に対して操作をしたい」場合はfindを、「ファイル名の一部だけ分かっていて、とにかく早く場所を知りたい」場合はlocateを利用すると良いでしょう。

findlocateの使い分けまとめ
特徴 findコマンド locateコマンド
検索速度 遅い(リアルタイム検索) 速い(データベース検索)
検索範囲 指定したディレクトリ以下 データベースに登録された全ファイル
情報の鮮度 最新 データベース更新時まで
柔軟性 高い(詳細な条件設定可能) 低い(主にファイル名)
管理者権限 必要な場合がある(削除やシステム全体検索) 原則不要(ただし全ファイルのDB更新にはsudo updatedbが必要)
用途 特定の条件で詳細な検索 大まかなファイル名を高速検索

この記事がfindlocateの使い分けについて理解を深める一助となれば幸いです。
ご覧いただきありがとうございました。

次回は、Linuxにおけるプロセス管理の要であるps auxtopコマンド、そしてkillコマンドの使い分けについて解説します。どうぞお楽しみに!

私たちは、お客さまが私たちのウェブサイトをどのように使用するのかを理解し、お客さまの体験を改善するために Cookie を使用しています。 閲覧を続けると Cookie の使用に同意したことになります。
拒否した場合、このウェブサイトにアクセスしてもお客さまの情報は追跡されません。 情報を追跡しない設定を記憶するために、ウェブブラウザで 1 つだけ Cookie が使用されます。