【Linux】ファイルの検索方法!findやlocateコマンドの使い方と違い
この記事からわかること
- Linux:ファイルの検索方法とは?
- findやlocate、witchコマンドの使い方
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
Linuxにおけるファイルの検索方法
Linuxではパソコン内のどこにファイルがあるかを検索できるコマンドが用意されています。これを使うことでそのファイルまでの絶対パスが取得できたり、見つかったファイルに対してそのまま処理を加えることもできます。
検索できるコマンド
- find
- locate
- witch
これからはこのような階層構造がある体でコマンドの結果を表示していきます。
/ (ルートディレクトリ)
├── home
│ └── ame
│ └── desktop
│ ├── sample.html
│ └── project ★カレントディレクトリ
│ ├── index.html
│ ├── css
│ ├── style.css
│ └── reset.css
│ └── image
│ ├── ame.png
│ └── chocolate.jpg
findコマンドの使い方
find [検索対象ディレクトリ] [検索値]
findコマンドは検索範囲と検索値を指定してマッチするファイルがあればファイルのパスを返してくれます。検索値には定義されているオプションと値を渡し、ファイル名や更新日時、アクセス権などファイルに関する情報で絞ってマッチするファイルを検索することが可能です。
[検索対象ディレクトリ]
はカレントディレクトリからの相対パスまたは絶対パスで指定します。省略するとカレントディレクトリ以下が検索対象になります。
拡張子が「.css」のファイルをcss以下から検索
$ find css -name "*.css"
css/reset.css
css/style.css
拡張子が「.html」のファイルをカレントディレクトリ以下から検索
$ find -name "*.html"
($ find ./ -name "*.html") でも可能
/index.html
「sample」が含むファイルを一階層上から検索
$ find ../ -name "sample*"
../sample.html
「reset.css」ファイルを絶対パスでproject以下から検索
$ find /home/ame/desktop/project -name "reset.css"
/home/ame/desktop/project/css/reset.css
このように-name
オプションを使えばファイル名(ディレクトリ名)に指定の文字列を含むものを検索することができます。文字列には「*(0文字以上の一致)
」や「?(任意の1文字に一致)
」といったメタキャラクタを使用することができます。
findコマンドのオプション一覧
オプション | 役割 |
---|---|
-name ファイル名 | ファイル名で検索 |
-user ユーザ名 | 所有者で検索 |
-atime 日時 | 最後のアクセス日時で検索 |
-mtime 日時 | 更新日時で検索 |
-mmin 分数 | 更新分数で検索 |
-perm アクセス権 | アクセス権で検索 |
マッチしたファイルを表示 | |
-print0 | 検索結果をnull文字区切りで得る |
-maxdepth | 指定した階層までを検索対象に |
-mindepth | 指定階層から下を検索対象に |
-size サイズ | ファイルサイズで検索 |
-type 種類 | ファイルの種類で検索 f:ファイル l:シンボリックリンク d:ディレクトリ |
-newer 元ファイル名 | 指定ファイルの更新日時よりも後に変更したファイルやディレクトリを検索 |
-anewer 元ファイル名 | 指定ファイルの更新日時よりも後にアクセスしたファイルやディレクトリを検索 |
-and | 複数のうち全ての条件にマッチするファイルを検索 |
-or | 複数のうちいずれかの条件にマッチするファイルを検索 |
-not | 条件を否定 |
-delete | 条件に合致するファイルを削除 |
-empty | 容量が0のファイルを検索 |
-exec コマンド {} \; | マッチしたファイルに対して コマンドを実行 |
マッチしたファイルに対してコマンドを実行する方法
findコマンドで--exec
を指定すればマッチしたファイルに対して別コマンドの処理を実行することもできます。例えばファイルの中身を表示させるcat
コマンドを使用してみます。複数のファイルがマッチする場合はその全てに対してコマンドが実行されるので以下の場合は「style.css」と「reset.css」2つの内容が表示されます。
拡張子が「.css」のファイルを検索しマッチしたものを表示
$ find ./ -name "*.css" -exec cat {} \;
style.cssの内容
reset.cssの内容
-exec コマンド {} \;
この書式は空白の位置などが1つずれると正常に動作しないこともあるので注意してください。
$ find ./ -name "*.css" -exec cat {}\;
find: -exec: no terminating ";" or "+"
locateコマンドの使い方
locate
コマンドもパソコン内のファイル(ディレクトリ)を検索できるコマンドです。しかしfind
とは異なりマッチしたファイルへのコマンドの実行や複雑な検索条件(アクセス権など)を設定しての検索はできません。ですがfindコマンドより高速に検索することができます。
$ locate "*.html"
/home/ame/desktop/sample.html
/home/ame/desktop/project/index.css
実行結果はファイルの絶対パスです。カレントディレクトリ以下のみを検索するといったこともできず、パソコン内でマッチしたファイル全ての絶対パスが表示されます。
updatedbコマンドとは?
locate
コマンドのファイル検索はあらかじめ作成されているデータベースを参照して検索しています。データベースは定期的に更新されますが、更新後に作成したファイルなどはlocate
コマンドの実行結果に反映されない可能性もあります。
そこでデータベースを手動で更新するコマンドがupdatedb
コマンドです。一般ユーザーでは以下のようにうまく実行できなかったのでスーパーユーザーに切り替えて実行してみます。
$ updatedb // 一般ユーザーでは実行できない
updatedb: can not open a temporary file for '/var/lib/mlocate/mlocate.db'
$ su // スーパーユーザーに切り替え
# updatedb
# // 成功
whichコマンドの使い方
似たような検索コマンドにwhich
があります。which
コマンドはファイルの検索ではなくコマンドを検索してくれる役割を持っています。実行結果はそのコマンドが格納されている絶対パスが表示されます。
$ which echo
echo: shell built-in command
$ which date
/bin/date
$ which composer
/usr/local/bin/composer
コマンドが組み込み済みのコマンド(shell built-in command)なのかどこかに格納されているコマンドなのかを識別することも可能です。whichコマンドの検索範囲は環境変数$PATHにパスが通っている範囲のみになります。まだパスを通していないコマンドなどは表示されないので注意してください。
findとlocateの違い-まとめ-
項目 | find | locate |
---|---|---|
返す値 | 指定ディレクトリからの 相対パス |
絶対パス |
複雑な検索 | 可能 | 不可 |
処理速度 | 普通 | 高速 |
マッチ後に コマンド実行 |
可能 | 不可 |
参照 | リアルタイムの構造 | データベース |
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。