Personal tools
You are here: Home ブログ matsuyama GNU locate を有効活用する
Document Actions

GNU locate を有効活用する


GNU findutils に入ってる locate/updatedb は本来にシステム管理用のソフトウェアですが、いつくかのオプションを与えることで、特定のディレクトリのみを検索対象にすることができ、 Emacs などのバックエンドとしても利用しやすくなります。今回は GNU locate を有効活用して、 Emacs で階層の深いファイルを簡単に開く方法を紹介します。

GNU findutils のインストール

http://www.gnu.org/software/findutils/

上の URL からソースコードをダウンロードしてきて以下のようにインストールします。 Gentoo を使っている場合でもソースコードからインストールする必要があります(セキュリティ上の問題から findutils の locate/updatedb はインストールされないようになっている)。

% tar xvzf findutils-4.3.8
% cd findutils-4.3.8
% ./configure && make && make install
% /usr/local/bin/locate --version
GNU locate version 4.3.8
Built using GNU gnulib version 2007-05-26

ラッパースクリプトの作成

locate や updatedb するたびにオプションでデータベースファイルのパスを指定したりするのは面倒なので簡単なラッパースクリプトを作って、オプションの入力を極力減らします。

このエントリに添付してある locate と updatedb をダウンロードしてきて以下のようにインストールします。

% mkdir ~/bin
% cd ~/bin
% cp ~/downloads/locate ~/downloads/updatedb .
% chmod +x locate updatedb
% echo 'export PATH="$HOME/bin:$PATH"' >> ~/.profile
% source ~/.profile

PATH 環境変数の先頭に ~/bin を追加することによってラッパースクリプトを透過的に実行できるようにしています。ちゃんとパスが通っているかは以下のように確認します。

% which locate
/home/tomo/bin/locate

/usr/local/bin/locate のままなら正しくパスが通っていないので設定を再確認してください。

updatedb ラッパースクリプト

updatedb ラッパースクリプトはカレントディレクトリを検索対象としてデータベースを作成します。

% cd ~/music
% updatedb
% file PATH # データベースファイル
PATH: GNU findutils locate database data, format 02 (frcode)

GNU updatedb は --findoptions を使うことによって特定のディレクトリをデータベースから除外したりすることができます。

% updatedb --findoptions='-name tmp -prune' # tmp ディレクトリを除外

また updatedb ラッパースクリプトは ~/.updatedbrc から --findoptions を自動的に補完することができます。それをするには ~/.updatedbrc に、データベースファイルのパスの次の行に --findoptions の内容、という形式で記述していきます。

~/.updatedbrc:

/home/tomo/music/PATH
-name tmp -prune

/home/tomo/PATH
-name tmp -prune -o -name .svn -prune

このようにすることで updatedb するたびに --findoptions を入力する必要がなくなります。

locate ラッパースクリプト

locate ラッパースクリプトはカレントディレクトリから上にむかって PATH ファイルを検索し、 PATH ファイルが見つかったディレクトリを検索対象にして locate を実行します。

% cd ~/
% ls PATH music/PATH
PATH music/PATH
% locate hoge # ホームディレクトリを検索対象にして locate
% cd tmp
% locate hoge # ホームディレクトリを検索対象にして locate
% cd ../music
% locate hoge # music ディレクトリを検索対象にして locate
% locate -g hoge # 本来の locate をそのまま呼び出す

Emacs から使う

以下のようにデータベースファイルを作っておきます。

% cd ~/src/javaproj
% updatedb

~/.updatedb:

/home/tomo/src/javaproj/PATH
-name .svn -prune -o name classes -prune -o ! ( -name .svn -o -name "*.class" )

Emacs デ locate を実行する際は、 find-file や dired で ~/src/javarpoj 以下の適当なファイルやディレクトリを開いておきます。これにより locate ラッパースクリプトは、そのバッファのカレントディレクトリからデータベースファイルの検索を開始します。

locate コマンドを使う

以下の設定を ~/.emacs に書いておきます。

~/.emacs:

(eval-after-load "locate"
  '(progn
     (defadvice locate (before locate-buffer-cd activate)
       (setq locate-directory default-directory))
     (add-hook 'locate-mode-hook
               (lambda () (cd locate-directory)))))

後は通常通り M-x locate で検索できます。

globalff を使う

globalff は locate を使ってグローバルに find-file するパッケージです。 locate コマンドに似ていますが、 globalff は検索結果をインテラクティブに絞りこめるのでこちらのほうが多少使いやすいです。

http://emacswiki.org/cgi-bin/wiki/globalff.el

上の URL から globalff をインストールしてください。そして以下の設定を ~/.emacs に書きます。

~/.emacs:

(if (require 'globalff nil t)
    (defadvice globalff (before globalff-buffer-cd activate)
      (let ((buffer (get-buffer globalff-buffer))
            (dir default-directory))
        (if buffer
            (with-current-buffer buffer
              (cd dir))))))

後は M-x globalff で検索できます。以下のようにキーバインドしておくと便利かもしれません。

~/.emacs:

(global-set-key "\C-x\M-f" 'globalff)

anything を使う

antyhing の anything-c-source-locate ソースから使う事も可能です。

以下の設定を ~/.emacs に書きます。

~/.emacs:

(require 'anything-config)

(defadvice anything-initialize (after anything-buffer-cd activate)
  (let ((dir default-directory))
    (with-current-buffer (get-buffer anything-buffer)
      (cd dir))))

(setq anything-sources
      (list ...
            anything-c-source-locate
            ...))

後は M-x anything で検索できます。

最後に

以上のように特定のディレクトリを検索対象にすることで、高速に locate できる上、不必要なファイルが表示されないので、ソフトウェアの開発などにはかなり力を発揮すると思います(僕は毎日使ってます)。

updatedb updatedb
Size 1 kB - File type text/x-sh
locate locate
Size 1 kB - File type text/x-sh
Category(s)
linux
emacs
The URL to Trackback this entry is:
http://dev.ariel-networks.com/Members/matsuyama/use-gnu-locate/tbping
Add comment

You can add a comment by filling out the form below. Plain text formatting.

(Required)
(Required)
(Required)
(Required)
(Required)
This helps us prevent automated spamming.
Captcha Image


Copyright(C) 2001 - 2006 Ariel Networks, Inc. All rights reserved.