Linux管理・運用の基本
システム管理者のための実践ガイド
システム管理者のための実践ガイド
ls -lやcdで手当たり次第探し回ったことはありませんか?
そんな「迷子ファイル」を見つけ出すための強力なツールが、findコマンドとlocateコマンドです。
findとlocateについて、それぞれの特徴、メリット・デメリット、そして具体的な使用例を交えながら、どのような状況でどちらのコマンドを使うべきかを詳しく解説します。これらのコマンドをマスターすれば、あなたのシステム管理はもっと効率的になるはずです。findコマンドの基本的な使い方と、リアルタイム検索の利点、そして応用的な使い方locateコマンドの基本的な使い方と、高速検索の利点、そして知っておくべき注意点findとlocateの使い分けのポイントfindコマンドfindコマンドは、指定したディレクトリ以下をリアルタイムに検索するコマンドです。ファイル名だけでなく、最終更新時刻、ファイルサイズ、パーミッションなど、様々な条件で詳細な検索が可能です。検索には時間がかかりますが、常に最新の状態を反映した結果が得られます。
# 現在のディレクトリ以下で「.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コマンドは、さらに複雑な条件を指定したり、検索結果に対して別のコマンドを実行したりすることも可能です。
! (感嘆符) を使うことで、条件の否定ができます。
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コマンドの使い分けについて解説します。どうぞお楽しみに!