Mac/Linuxの「locate」コマンドで高速ファイル検索|「find」コマンドとの違いから「mdfind」の紹介まで

  • 153
    いいね
  • 1
    コメント

Linux系コマンドで、ファイルを検索するための
コマンドとしてはfindが有名ですが、
locateコマンド、更にはMacの場合
mdfindコマンドなるものが存在していることは
ご存知でしたか?

この記事では、
・locateコマンドの使い方
・mdfindコマンドの使い方
・それぞれのメリット、デメリットと違いを紹介します。

「find」と「locate」の違い

findコマンドとは

findコマンドはコマンドを打つたびに
ファイル階層を検索し直すため、
検索に時間がかかることが難点です。

Since the find command walks through the filesystem hierarchy, it may take a long time to complete, and if you specify the root folder only (without using flags to prevent recursion), it may recurse through the /Volumes/Macintosh HD/ mount point directory repeatedly and never end the search.

(Retrieved from here)

locateコマンドとは

locateコマンドとは、データベースを
作成し、それに基づいて検索を行います。

したがって、つねにライブサーチを行う
findコマンドより、一般的には
「速い」とされています。

始め方と使い方

始め方

Macの場合、まずlocateコマンドを打っても
以下のエラーが出るはずです。

$ locate sample
> WARNING: The locate database (/var/db/locate.database) does not exist.
To create the database, run the following command:

  sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist

Please be aware that the database can take some time to generate; once
the database has been created, this message will no longer appear.

なので、ステップは以下のとおりです。

1. 上記エラーに基づいて、以下のコマンドを打ち込みデータベースを作成。

$ sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist

2. データベース作成に時間がかかるので数分まつ。

3. (もしこれで使えない場合は)以下のコマンドでデータベースを更新する。これは定期的にする必要がある。

$ sudo /usr/libexec/locate.updatedb

Aliasを設定する

データベースの更新ですが、
毎回sudo /usr/libexec/locate.updatedbコマンドを
入力しているのは面倒なので、updatedbコマンドにでも
エイリアスを設定しておきましょう

自分のシェルの設定ファイルに
以下を書き込んであげれば大丈夫です。
~/.bashrcや~/.zshrcなどです。

alias updatedb='sudo /usr/libexec/locate.updatedb'

実はもうひとつある - 「mdfind」コマンド

概要

Spotlightのコマンド版、
Mac専用のコマンドがあります。
それが、「mdfind」コマンドです。

単純に、検索したいファイル名を
入力してあげればいいだけです。

$ mdfind test

Note that the documents found are grouped by type, and even include things you might not consider as documents. In this case, the search for Perl on my iBook found mail messages and Keynote presentations, as you'd probably expect, but also Address Book and iCal entries. It's also reassuring that it found mdfind.html, the working version of this article. Sample results from searching my iBook for "perl" are shown below.

(Retrieved from here)

で、違いあるの?

メリット・デメリット

Macworldのコメントによれば、
findコマンドは現在の状態をサーチしているため、最も遅い
locateコマンドはデータベースに依存するため、findコマンドより早い可能性があるが、データベースの更新をする必要が有るため、検索漏れが出てしまうことがある
mdfindコマンドは、locateと同じくらい早いはず。スポットライトのデーモンによって常にデータベースは更新されている。

'find' performs a live search by traversing the file system. This is similar to searcing prior to the introduction of Spotlight and is the slowest of the three.

'locate' relies on a database that is periodically refreshed. It's going to be faster than 'find', but has the potential to be out of date depending on when the database was last updated (I think this is performed nightly, I'd have to look at the launchd settings).

'mdfind' is an interface to Spotlight. It should be as fast as 'locate', but the database is constantly updated by the Spotlight daemon.

(Retrieced from here)

技術的背景

同じ方によると、検索の技術的背景は
以下のように違う、とのこと。

findコマンドはファイル名から種類、作成日時までの膨大なオプションを検索している
locateコマンドは単純にファイル名を検索しているだけ
mdfinfコマンドはfindコマンドと検索範囲は似通っているが、「スポットライト」で使われる固有のid名みたいなものを検索に使っている。

'find' accepts a huge range of options from file name to type to modification date.

'locate' is pretty much just a file name, or partial.

'mdfind' takes a range similar to 'find', but requires that they be in the "Spotlight" language, like "kMDItemFSName" for restricting the search to the file name. O'Reilly has good coverage of this: http://macdevcenter.com/pub/a/mac/20...04/mdfind.html

(Retrieced from here)

SpotlightやAlfredではだめなのか

いいと思います。
でも、CUIで作業していて、そのままその
流れで検索したい時とか、普通にあるので。

また、GUIなので多少感度というか
速度が違うかなというイメージです
(もしかしたら思い違いかもしれませんが)

それから、普段使っているSpotlightの
技術的背景を知っているだけでも、
検索している時に困ることも少ないかもしれません。

参考リンク

【 locate 】 ファイルを高速に検索する
MACのファイル高速検索「locate」コマンドやってみた
Alternative to locate/find command line on mac