argius note

プログラミング関連

Fruiでlocateもどきを作ってみた

手前味噌ですが。→http://argius.net/product/#frui
UNIX系OSには、locateというコマンドがあります。これは、直接ファイルを検索せずに、予め作っておいたファイル情報データベースを使って検索を行います。そのため、高速に検索できるという利点がありますが、リアルタイムな変更に弱い欠点もあります。
Windowsのコマンドプロンプトで出来るのかどうかは知りませんが、コマンドプロンプトについて調べるのは非常に億劫なので、似たようなことをFruiを使って実現させてみようと考えました。
名前は"floc(付録)"とでもしておきます。
※ここで使用しているもの:Windows=XP/jdk1.4.2、Linux=FedoraCore6/jdk1.5.0

追記:バージョン0.9.2の時点では、リストにあるファイルが移動または削除されている場合にエラーが表示されてしまうので、エラー出力を捨てるなどで回避しないといけません。次バージョンでは終了後に警告を出すようにしようかと思います。

仕様

locateはfindに近い動作ですが、"floc"はカレントディレクトリは関係なく、ドライブの全ファイルから指定した条件のファイルを検索します。
また、"frui.ignore"というキーワードを含むパスを無視するようにします。

ファイル情報データベースを作る

データベースと言っても、ここでは単なるファイル一覧のことです。PCを起動したときなどに、このファイル一覧を生成するようにしておきます。
Windowsの場合は、下記の処理を"floc.scan.bat"という名前で「スタートアップ」に置いておきます。これでPC起動時にファイル一覧が作成されます。パスは環境に合わせて設定してください。

@java -jar frui.jar -d C:/ ! frui.ignore > floc.log

Unix/Linuxは、Javaシンボリックリンクの循環が解決できないので、(動かないわけではないが)泣く泣く"find"で生成します。起動タイミングはお好みで。(locateはcronを使ったりするらしいです。)

#!/bin/sh
# floc.scan.sh
find / | grep -v frui.ignore > floc.log

ファイル一覧を使って検索

"floc"本体を作ります。
Fruiは"-i/--stdin"オプションを指定すると、標準入力を読み込んで検索を行います。これは、"find"をパイプしたりして使うことを想定しています。
Windowsの場合は、次の処理をパスの通っているフォルダ(C:\WINDOWSなど)に"floc.bat"というファイル名で保存します。

@echo off
java -jar frui.jar -i %* < floc.log

Unix/Linuxは、やはりパスの通っているディレクトリに"floc"というファイル名で以下のスクリプトを保存します。

#!/bin/sh
java -jar frui.jar -i $* < floc.log

あとはどちらも同じように使えます。

$ floc java1.6 .jar -s +10m -l
      46,014,333 20xx/xx/xx xx:xx:xx /java1.6/jre/lib/rt.jar
      12,159,158 20xx/xx/xx xx:xx:xx /java1.6/lib/tools.jar