ファイルパスを検索し結果をJSONで返すサーバーを立て、ブラウザに表示するファイルを配信します。
ウェブブラウザからの入力で指定ディレクトリ下にあるファイル内の文字列に対してlocateコマンドを使用した正規表現検索を行い、結果をhtmlにしてウェブブラウザに表示します。
- mlocate
- gocate
Windows, Linux OK
MacOS 未テスト
Usage of ./locate-server:
-d string
Path of locate database directory (default "/var/lib/mlocate")
-debug
Debug mode
-dir string
Path of locate database directory (default "/var/lib/mlocate")
-p string
Server port number. Default access to http://localhost:8080/ (default "8080")
-port string
Server port number. Default access to http://localhost:8080/ (default "8080")
-r string
DB insert prefix for directory path
-root string
DB insert prefix for directory path
-s OS path split windows backslash
-t string
DB trim prefix for directory path
-trim string
DB trim prefix for directory path
-v show version
-version
show version
-windows-path-separate
OS path separate windows backslash
$ locate-server \
-d /home/mydir/mlocate \
-windows-path-separate \
-trim '\\gr.jp\share' \
$ go install github.com/u1and0/locate-server@latest
or use docker
$ docker pull u1and0/locate-server
locate-server実行時にglibcが必要
./locate-server: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32' not found (required by ./locate-server)
cgoを無効にしてビルドすれば解決。
CGO_ENABLED=0 go build
$ go test
- 検索ワードを指定して検索を押すかEnterキーを押すと共有フォルダ内のファイルを高速に検索します。
- 対象文字列は2文字以上の文字列を指定してください。
- 英字 大文字/小文字は無視します。
- 全角/半角スペースで区切ると0文字以上の正規表現(.*)に変換して検索されます。(AND検索)
(aaa|bbb)
のグループ化表現が使えます。(OR検索)- 例: golang (pdf|txt) => golang及びpdf並びにgolang及びtxtを検索します。
- [a-zA-Z0-9]の正規表現が使えます。
- 例: file[xy] txt でfilex及びtxt並びに*とfiley及びtxt** を検索します。
- 例: file[x-z] txt でfilex及びtxt並びにfiley及びtxtとfilez.txt を検索します。
- 例: 201[6-9]S => 2016S, 2017S, 2018S, 2019Sを検索します。
- 0文字か1文字の正規表現
?
が使えます。- 例: jpe?g => jpeg と jpgを検索します。
- 単語の頭に半角ハイフン"-"をつけるとその単語を含まないファイルを検索します。(NOT検索)
- 例: gobook txt -doc=>gobookとtxtを含みdocを含まないファイルを検索します。
- AND検索は順序を守って検索をかけますが、NOT検索は順序は問わずに除外します。
- 例: gobook txt -doc とtxt gobook -doc は異なる検索結果ですが、 gobook txt -doc とgobook -doc txtは同じ検索結果になります。
- ファイル拡張子を指定するときは、文字列の最後を表す**$**記号を行末につけます。
- 例: **gobook pdf$ **=>gobookを含み、pdfが行末につくファイルを検索します。
- 検索結果はリンク付で最大1000件まで表示します。(v2.X.Xまで)
- リンクをクリックするとファイルが開きます。
- << マークあるいはフォルダアイコンをクリックするとそのファイルがあるフォルダが開きます。
ページタイトルに検索ワードが付属するので、ブラウザの戻るを長押ししたときに検索履歴が表示されます。
ブックマークすることで、ワンクリックで検索を開始し、結果を表示できます。
検索バーのURLは他人に送付することができます。 URLを送られた人はリンクをクリックするだけで検索バーに入力した文字列で検索を開始し、結果を閲覧することができます。
検索ツールボックスにはこれまで検索した検索語を検索候補として表示します。
説明 | メソッド | URI | パラメータ | パラメータ例 |
---|---|---|---|---|
ファイルパスの検索結果をJSONで返す | GET | /json | q=, logging= | http://localhost:8080/json?q=keyword http://localhost:8080/json?q=keyword&logging=false loggingの値はboolian, falseのとき、検索キーワードを履歴に残さない |
ファイルパスの検索結果をHTMLで表示する | GET | /search | q=, logging= | http://localhost:8080/json?q=keyword http://localhost:8080/json?q=keyword&logging=false loggingの値はboolian, falseのとき、検索キーワードを履歴に残さない |
検索履歴を見る | GET | /history | gt=, lt= | http://localhost:8080/history?gt=10<=1000 10以上、1000未満のスコアの履歴のみJSONで返す |
DBの状態確認 | GET | /status | なし | http://localhost:8080/status ステータス表示 |
インターネット設定からhttp://(ホストマシンのIPアドレス)を信頼するサイトに追加します。
参考: MS11-057 KB2559049 更新後 file://プロトコルでリンクしている共有ファイルが開けない
拡張機能を追加します。
"GoogleChromeでリンクをクリックしてもファイルが開かない現象について" を参照してください。
アドオンを追加します。
Dockerコンテナによるシステム構成
docker create --name db -v /var/lib/mlocate -v /ShareUsers:/ShareUsers:ro busybox
このコマンドではdbコンテナの/varlib/mlocate
を外部に晒して、
ホストのShareUsersをdbコンテナにマウントする。
ShareUsersがlocate
コマンドをかける対象のディレクトリ。
docker run --name app\
--volumes-from db\
-e UPDATEDB_PATH=/ShareUsers/<path to the db root>\
-e OUTPUT=mlocatepersonal.db\
u1and0/upadtedb
このコマンドではdbコンテナのボリュームを参照し、
updatedb
をかけるパスをUPDATEDB_PATH
で指定している。
dbでマウントしているのでこのコンテナで再度マウントする必要はない。
環境変数OUTPUT
は出力するファイル名を指定する。
ディレクトリは/var/lib/mlocate
に固定される。
docker run --name web --volumes-from db u1and0/locate-server [OPTIONS]
docker run --name web --rm -t\
--volumes-from db\
-e TZ='Asia/Tokyo'\
-e LOCATE_PATH='/var/lib/mlocate/mlocatepersonal.db:/var/lib/mlocate/mlocatecommon.db'\
-p 8081:8080\
u1and0/locate-server -s -r '\\DFS' # オプションのみ
TZを指定しないとDBの更新日時がGMTになってしまう。
LOCATE_PATH
はappコンテナで指定したパスの数だけ:
で区切って記述する。
u1and0/locate-serverコンテナはENTRYPOINTで動くのでコンテナの指定後はオプションのみを記述する。
$ docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' web
TZ=Asia/Tokyo
LOCATE_PATH=/var/lib/mlocate/mlocatepersonal.db:/var/lib/mlocate/mlocatecommon.db:/var/lib/mlocate/mlocatecommunication.db
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
LANG=C.UTF-8
- updatedbするコンテナを作成
docker run --name personal --volumes-from db\
-e TZ='Asia/Tokyo'\
-e UPDATEDB_PATH=/ShareUsers/UserTokki/Personal\
-e OUTPUT=mlocatepersonal.db\
-d u1and0/updatedb
- locate-server実行コンテナに対して、環境変数
LOCATE_PATH
の内容を変更したものを再度作成( run )する 2.1.docker stop web
2.2.docker rename web web_old
# 今まで使っていたコンテナを退避(バックアップ) 2.3. 新しい環境変数を設定したコンテナをrun `docker run ... -e LOCATE_PATH="..."``
既知のバグ報告。
内部的にString.ReplaceAll()を使用しているため。
- サーバーが用意するレスポンスステータスはすべて200
- ドキュメント作成 doc/Goでファイル検索を行うサーバーを立てる.md
- ディレクトリの構造、名前改変
- クライアントサイド error表示機能
- API追加
- 検索結果をJSONとして取得し、非同期にHTMLとして描画します。
- 検索ワードハイライト機能をサーバーサイドからクライアントサイドで実行するように変更しました。
- 検索結果上限数の撤廃および検索結果の遅延ロード。
- IE非対応化
gocate -- -S
を使用せず、locate -Sd "dbpathのファイル"
を使用するように変更
- gocate に合わせて内部動作を微修正しました。
- gocate -init (updatedbモード)に対応して、/var/lib/mlocate下を検索するようにしました。
- LOCATE_PATH を使用しないように変更しました。
- xargsによるマルチスレッド検索廃止しました。
- 代わりにマルチスレッド版locateとしてgocateを実装しました。
- Dockerベースイメージ修正 -> golang:1.15.3-alpine3.12
- Version上方修正
- Docker空間にJavascriptファイルが抜けていたのを追加
- 検索ウィンドウの文字列を部分文字列一致で候補を絞り込めるようにしました。
- 6時間以内の検索スコアを上げました。
- backupコンテナをlogファイルとdbファイルのバックアップを別々にとる挙動にしました。
- 検索ツールバーに検索の予測候補を表示します。
- 予測候補は検索履歴を解析して、過去のキーワードをFrecency(Frequently 頻繁に + Recency 最近の)に検索された順番に表示します。
- 検索履歴は正規化され、重複なしに検索ツールバーに記録されます。
- キーワードを入力するたびに予測候補が表示されます。(ブラウザ標準のdatalistタグを利用)
- 検索ヘルプを最小化表示しました。
- クリックでトグルします。
マルチスレッド検索を有効化するオプションlocate-server -P [NUM]
を実装しました。- マルチスレッド機能は現在調整中。
-P 1
以外の指定で検索されないときがあります。 - オプションの使い方は
man xargs
の-P
オプションを参照してください。 - 検索履歴を読み込んで検索キーワードを使いまわしやすくしました。
- locateコマンドの実行可否チェック、ファイルアクセスチェックを追加しました。
- defer節によるfileクローズを明示しました。
- ハイライト文字列を全ワードから1ワードに変更しました。
- "\W"などの大文字の正規表現をログに記録できるように、バックスラッシュの後を小文字に正規化しないようにしました。
- ページタイトルに検索ワードを追加して、履歴を辿りやすくしました。
locate -S
の結果にerrorがあった場合の挙動を加えました。- cacheの初期化を簡易にしました。
- errorに関するコメントを削除しました。
- データベースの更新およびキャッシュの初期化を1日1回にしました。
- AddPrefix()とChangeSep()をPathMapのメソッドに移動しました。
- 最大8時間以内に検索したワードはメモリ上にキャッシュされ、再度検索する際はキャッシュから検索結果を取り出します。
- NOT検索を実装しました。検索後の頭に「-」ハイフンをつけて検索するとその語を含む結果は除外されて表示されます。
- 構文の最適化を行い、パフォーマンスの改善を行いました。
- 検索文字の背景を黄色で表示するようにしました。
- データベース情報を表示するリンクを追加しました。
- 構文の最適化を行い、パフォーマンスの改善を行いました。
- 検索文字列のエラーチェックで2文字以上のときだけ検索します。
- (aaa|bbb)のようにしてaaaまたはbbbを検索します。
- 検索説明文を追加しました。
- [rm] locate command -v option cause of compress disk space @app/Docker
- [mod] wipe default run-part command @app/Dockerfile
- URLをquery表示することで前回の検索履歴を他人から見られなくしました。
- 検索ワードを指定して検索を押すかEnterキーを押すと共有フォルダ内のファイルを高速に検索します。
- 英数字の大文字小文字は無視します。
- 全角/半角スペースで区切るとは0文字以上の正規表現(*)に変換して検索されます。(=and検索)
- 検索結果はリンク付で最大1000件まで表示し、リンクをクリックするとファイルが開きます。
- ?や[a-zA-Z0-9]の正規表現が使えます。
- 前回の検索履歴がアクセスした人すべてに見られてしまいます。(改善予定)
- フォルダジャンプ機能に対応しました。
リンク右端の"<<"をクリックすると、そのファイルがあるフォルダがファイルエクスプローラーにて開きます。