Linux でファイル名からファイルの所在を見付けるのに最も便利なのは locate コマンドです。locate コマンドを利用するためには、インデックスが作成されている必要があります。インデックス作成には updatedb コマンドが使われます。24時間稼働しているサーバーでは updatedb は自動的に深夜に実行されるようですが、デスクトップとしてLinux を使っている場合は root アカウントで時々 updatedb を起動する必要があります。大体、次のような手順になります。
$ su Password: (root アカウントのパスワードを入力) # updatedb & [1] 13912 # exit $ locate .pm
上のように locate .pm と入力すると ディスクの中の Perl モジュールのリストを即座に表示してくれます。
locate コマンドだけでも、十分強力ですが、これを、wgrep のときと同じようにハイパーリンクにしようと思います。まず、locate の出力をHTML形式にするスクリプト locf.pl を作ります。
ファイル名:locf.pl #!/usr/bin/perl while (<>) { chop; print "<a href=\"$_\">$_</a><br>\n"; }
次に locate の出力をハイパーリンクにするスクリプト wlocate を作成します。
ファイル名:wlocate #!/bin/sh exec locate $@ | locf.pl | w3m -T text/html
locf.pl と wlocate のパーミッションを実行可能にします。
$ chmod +x locf.pl wlocate
準備が整ったところで、コンソールから wlocate を使ってみましょう。
$ wlocate .pm
lynx を使った llocate も作れます。
ファイル名:llocate #!/bin/sh locate $@ | locf.pl > ~/.locf.html exec lynx ~/.locf.html
wlocate で出力されるリストが長過ぎて grep でフィルターしたいときがあります。そんなときは locf.pl を単体で使って下のようにすることができます。
$ locate php | grep manual.html | locf.pl | w3m -T text/html
wlocate は sed でも書くことができます。かなりコンパクトに書けます。
#!/bin/sh locate $@ | sed 's/^.*$/<a href="&">&<\/a><br>/' | w3m -T text/html
wlocate は便利ですが、*.rb のような Ruby のファイルは開けずにダウンロードになってしまいます。Control-g でキャンセルできますが、Ruby のファイルを読めないと不便で仕方がありません。これは *.rb ファイルの MIME タイプが application/x-ruby になっているからです。
そこで、~/.w3m ディレクトリに次のような設定ファイル mime.types を作成したところ、 *.rb ファイルの MIME タイプを text/x-ruby に変更して w3m で表示できるようになりました。
~$ cd .w3m ~/.w3m$ cat mime.types text/x-ruby rb text/x-javascript js
上のファイルでデリミタはタブを使っています。ついでに JavaScript のファイルも読めるようにしています。これで wlocate の弱点はなくなりました。
wlocate のソースを編集して
$ locate .rb | grep home | wlocate
というように、間に grep を挟むことができるようにしました。次がそのソースです。
#!/bin/sh if [ $# -ne 0 ]; then locate $@ | sed 's/^.*$/<a href="&">&<\/a><br>/' | w3m -T text/html else sed 's/^.*$/<a href="&">&<\/a><br>/' | w3m -T text/html fi
リンクのナビゲーションは w3m オリジナルのものより lynx 風のキーマッピングが便利です。リンクの移動は上下矢印で、右矢印でリンクを辿ります。もとのベージには左矢印で戻れます。ページ内のカーソルの移動は vi 風に h, j, k, l キーで行います。
キーマップを変更するのは、/usr/share/doc/w3m/ja/keymap.lynx を ~/.w3m/ ディレクトリにコピーするだけです。