【Linux】ファイルの検索方法!findやlocateコマンドの使い方と違い

【Linux】ファイルの検索方法!findやlocateコマンドの使い方と違い

この記事からわかること

  • Linuxファイル検索方法とは?
  • findlocatewitchコマンド使い方

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

Linuxにおけるファイルの検索方法

Linuxではパソコン内のどこにファイルがあるかを検索できるコマンドが用意されています。これを使うことでそのファイルまでの絶対パスが取得できたり、見つかったファイルに対してそのまま処理を加えることもできます。

検索できるコマンド

これからはこのような階層構造がある体でコマンドの結果を表示していきます。

/ (ルートディレクトリ) 
├── 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 アクセス権 アクセス権で検索
-print マッチしたファイルを表示
-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
返す値 指定ディレクトリからの
相対パス
絶対パス
複雑な検索 可能 不可
処理速度 普通 高速
マッチ後に
コマンド実行
可能 不可
参照 リアルタイムの構造 データベース

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index