ls -l
やcd
で手当たり次第探し回ったことはありませんか?
そんな「迷子ファイル」を見つけ出すための強力なツールが、find
コマンドとlocate
コマンドです。
この記事では、Linuxでファイルを検索するための主要なコマンドである
find
とlocate
について、それぞれの特徴、メリット・デメリット、そして具体的な使用例を交えながら、どのような状況でどちらのコマンドを使うべきかを詳しく解説します。これらのコマンドをマスターすれば、あなたのシステム管理はもっと効率的になるはずです。find
コマンドの基本的な使い方と、リアルタイム検索の利点、そして応用的な使い方locate
コマンドの基本的な使い方と、高速検索の利点、そして知っておくべき注意点find
とlocate
の使い分けのポイント- 状況に応じたファイル検索の具体例と、よくある間違い
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
を利用すると良いでしょう。
find
とlocate
の使い分けまとめ
特徴 | find コマンド |
locate コマンド |
---|---|---|
検索速度 | 遅い(リアルタイム検索) | 速い(データベース検索) |
検索範囲 | 指定したディレクトリ以下 | データベースに登録された全ファイル |
情報の鮮度 | 最新 | データベース更新時まで |
柔軟性 | 高い(詳細な条件設定可能) | 低い(主にファイル名) |
管理者権限 | 必要な場合がある(削除やシステム全体検索) | 原則不要(ただし全ファイルのDB更新にはsudo updatedb が必要) |
用途 | 特定の条件で詳細な検索 | 大まかなファイル名を高速検索 |
この記事がfind
とlocate
の使い分けについて理解を深める一助となれば幸いです。
ご覧いただきありがとうございました。
次回は、Linuxにおけるプロセス管理の要であるps aux
やtop
コマンド、そしてkill
コマンドの使い分けについて解説します。どうぞお楽しみに!