ファイルシステムのインデックス作成とクエリを行うための滑稽なほど高速な方法。 locate / mlocate / updatedb を置き換えます。 Rustで書かれています。
Lolcate は、locate / mlocate / updatedb に代わる高速、軽量、多用途のツールです。
特徴は次のとおりです。
Lolcate は、単一のバイナリ実行可能ファイルとして提供されます。
Lolcate は mlocate / updatedb と互換性を持たせるつもりはありません。
Locate は 2 つのフェーズで動作します。
これは、データベースの 1 つに一致するパス名のリストを設定するために指定したいくつかのインデックス作成ルールに従って、ファイルシステムの一部にインデックスを作成します。
ファイルのパス名のみがインデックス付けされ、Lolcate はファイルの内容には関係しません。
さまざまな目的に応じてさまざまなデータベースを作成できます。
必要に応じていつでも lolcate を実行してデータベースに対してクエリを実行すると、指定したクエリ ルールに一致するパス名が返されます。
同じlolcate
バイナリ実行可能ファイルは、インデックス作成とクエリの両方を実行します。
シェルのエイリアスと関数を使用して、好みに合わせてデータベースをクエリします。
alias d= ' lolcate --db documents '
alias zik= ' lolcate --db music --type audio '
z (){ mpv --playlist <( zik $1 ) ; }
zs (){ mpv --playlist <( zik $1 | shuf ) ; }
データベースの作成
Lolcate を使用する前に、データベースを作成する必要があります。作成しましょう:
$ lolcate --create
Created database ' default ' .
Please edit:
- the configuration file: /home/ngirard/.config/lolcate/default/config.toml
- the ignores file: /home/ngirard/.config/lolcate/default/ignores
データベースの名前を指定しなかったため、Lolcate はdefault
名前を選択しました。 lolcate --create --db <db_name>
を使用してデータベースの名前を指定することもできます。
インデックス作成ルール: インデックス対象の指定
次に、 config.toml
ファイルとignores
ファイルという 2 つのファイル (これは将来のバージョンで変更される可能性があります) を編集して、インデックスを作成する対象を指定する必要があります。
config.toml
ファイルは空ではなく、カスタマイズする必要がある定型的な内容で満たされています。次のようになります。
description = " "
# Directories to index.
dirs = [
# "~/first/dir",
# "/second/dir"
]
# Set to "Dirs" or "Files" to skip directories or files.
# If unset, or set to "None", both files and directories will be included.
# skip = "Dirs"
# Set to true if you want skip symbolic links
ignore_symlinks = false
# Set to true if you want to index hidden files and directories
ignore_hidden = false
# Set to true to read .gitignore files and ignore matching files
gitignore = false
これを変更して、インデックス作成用の 2 つのディレクトリを追加しましょう。
dirs = [
"~/Images",
"~/Documents"
]
お気づきのとおり、ディレクトリは引用符で囲み、カンマで区切る必要があります。また、ディレクトリ内のチルダは展開されますが、環境変数は展開されません。
skip = "Dirs"
を設定するとファイルのみのインデックスを作成することを選択でき、 skip = "Files"
を設定するとディレクトリのみのインデックスを作成することを選択できます。さらに、シンボリック リンクと隠しファイルおよびディレクトリは、それぞれignore_symlinks = true
およびignore_hidden = true
に設定することでスキップできます。
ignores
ファイルには、ファイルシステムのインデックス作成時に一致するパス名を無視するために Lolcate が使用するパターンが含まれています。 ignores
ファイルの構文は、.gitignore ファイルの構文と同じです。 config.toml
ファイルに従ってすべてにインデックスを付けたい場合は、空のままにすることができます。
これを変更して、次の 2 つのパターンを追加しましょう。
.git
*~
ファイルシステムのインデックス作成
これで、指定したルールに従ってファイルシステムにインデックスを付けるように Lolcate に指示する準備が整いました。
$ lolcate --update
Updating default...
繰り返しになりますが、Locate はデフォルトでdefault
データベースを更新します。 lolcate --update --db <other_db>
と入力して、別のデータベースを更新することを選択できます。また、 lolcate --update --all
と入力して、所有するすべてのデータベースを更新するように Lolcate に依頼することもできます。
データベースのクエリ
データベースにデータが設定されたので、データベースに対してクエリを実行できます。
最も単純な形式は、 lolcate [--db <dbname>]
です。
$ lolcate
/home/ngirard/Images/DCIM_101CANON/_MG_0006.jpg
/home/ngirard/Images/DCIM_101CANON/_MG_0007.jpg
/home/ngirard/Images/DCIM_101CANON/_MG_0004.jpg
(...)
パターンが指定されていない場合、クエリはデータベースからすべてを返します。
lolcate --all
すべてのデータベースからすべてを返します。
lolcate [--db <dbname>] <pattern>
を実行してパターンを指定することもできます。
$ lolcate 2018
/home/ngirard/Images/2018/01/9/IMG_1057.JPG
/home/ngirard/Images/2018/01/9/IMG_1059.JPG
/home/ngirard/Images/2018/01/9/IMG_1060.JPG
(...)
パターンは正規表現として解釈されます。
たとえば、2018 または 2019 のいずれかを含むパス名を探してみましょう。
$ lolcate 201[89]
/home/ngirard/Images/2018/01/9/IMG_1057.JPG
/home/ngirard/Images/2018/01/9/IMG_1059.JPG
(...)
/home/ngirard/Images/2019/01/9/IMG_1055.JPG
/home/ngirard/Images/2019/01/9/IMG_1058.JPG
(...)
Lolcate で使用される正規表現エンジンの完全な構文は、ここから入手できます。
lolcate <pattern1> <pattern2> ...
を使用して複数のパターンを指定できます。
たとえば、Images ディレクトリからすべての Readme ファイルを探してみましょう。
$ lolcate Images readme
/home/ngirard/Images/DCIM_101CANON/readme.txt
/home/ngirard/Images/2019/01/1/Readme
/home/ngirard/Images/2018/01/1/readme
パターンの検索は、デフォルトでは「スマートケース」です。これは、パターンがすべて小文字の場合は大文字と小文字を区別せずに検索され、それ以外の場合は大文字と小文字が区別されて検索されることを意味します。
たとえば、「readme」の代わりに「Readme」を使用して最新のクエリを実行すると、次のようになります。
$ lolcate Images Readme
/home/ngirard/Images/2019/01/1/Readme
-i | --case-insensitive
使用すると、大文字と小文字を区別しない検索を実行できます。 -i | --case-insensitive
オプション:
$ lolcate -i Images README
/home/ngirard/Images/DCIM_101CANON/readme.txt
/home/ngirard/Images/2019/01/1/Readme
/home/ngirard/Images/2018/01/1/readme
/home/ngirard/Documents/READMEs/2018-05-15-Cropping_images.txt
/home/ngirard/Documents/READMEs/2018-05-15-Cropping_images_fig1.jpg
/home/ngirard/Documents/READMEs/2018-05-15-Cropping_images_fig2.png
-b | --basename
オプションを使用すると、パターンはパス名のベース名に対してのみ照合できます。 -b | --basename
オプション:
$ lolcate -b images
/home/ngirard/Documents/READMEs/2018-05-15-Cropping_images.txt
/home/ngirard/Documents/READMEs/2018-05-15-Cropping_images_fig1.jpg
/home/ngirard/Documents/READMEs/2018-05-15-Cropping_images_fig2.png
パス タイプを定義し、クエリすることができます。
パス タイプは、Lolcate のグローバル構成ファイルに追加することで定義できます。 --info
オプションを呼び出すことで、このファイルを見つけることができます。
$ lolcate --info
Config file:
/home/ngirard/.config/lolcate/config.toml
(...)
次のパス タイプが事前定義されています。
[types]
img = ".*\.(jp.?g|png|gif|JP.?G)$"
video = ".*\.(flv|mp4|mp.?g|avi|wmv|mkv|3gp|m4v|asf|webm)$"
doc = ".*\.(pdf|chm|epub|djvu?|mobi|azw3|odf|ods|md|tex|txt)$"
audio = ".*\.(mp3|m4a|flac|ogg)$"
これらのパス タイプはクエリで使用できます。
$ lolcate --type img cropping
/home/ngirard/Documents/READMEs/2018-05-15-Cropping_images_fig1.jpg
/home/ngirard/Documents/READMEs/2018-05-15-Cropping_images_fig2.png
パス名パターン、ベース名パターン、および型パターンは完全に混合できます。
$ lolcate --basename [eé]conomie --type doc
/home/ngirard/Documents/Notes/2018-11-12-Economie_politique.tex
/home/ngirard/Documents/Notes/2019-01-03-Économie_politique.md
$ lolcate --basename [eé]conomie --type doc 2018
/home/ngirard/Documents/Notes/2018-11-12-Economie_politique.tex
構成ファイルは$XDG_CONFIG_HOME/lolcate
または$HOME/.config/lolcate
に保存されます。
データベース ファイルは$XDG_DATA_HOME/lolcate
または$HOME/.local/share/lolcate
に保存されます。
mlocate
との違い次の Locate オプションには、Lolcate に相当するものはありません: --count
、 --existing
、 --follow
、 --transliterate
、 --limit
、 --nofollow
、 --null
。
これが最も簡単でお勧めの方法です。
最新のlolcate
のコンパイル済みバイナリを Github からPATH
に属するディレクトリにダウンロードします。
プリコンパイルされたバイナリは、Linux、MacOS、および Windows で利用できます。
必要に応じて、次のコマンドを使用して Rust と Cargo の現在の安定リリースをインストールします。
$ curl https://sh.rustup.rs -sSf | sh
必要に応じて、次の例を使用して~/.cargo/bin
PATH
に追加します。
$ export PATH= $HOME /.cargo/bin: $PATH
走る
$ cargo install lolcate-rs
最新リリースからソースをコンパイルする、または
$ cargo install --git https://github.com/ngirard/lolcate-rs
GitHub リポジトリから最新バージョンのソースをコンパイルします。
すべてのコントリビュートは歓迎されますが、私にとって理想的なコントリビュートは、レビューしながら Rust リテラシーを向上させることができる、きめ細かいプル リクエストです。前もって感謝します !
貢献を検討したい分野は数多くあります。
最も必要な機能は、パターン一致のカラー印刷出力 (#13) です。
Locate はまだライブラリとして使用できません。
私は無視ルールが別の設定ファイルに保持されていることに満足していません (#14)。
テスト中。
Lolcate に完全なテストベンチを提供するために再利用/活用できる既存のコードに関するアドバイスに非常に興味があります。
バックエンド戦略。
Lolcate は現在、データを lz4 圧縮されたパス名のリストとして保存し、 lolcate --update
が実行されるたびに再作成します。それはできる限り簡単です。私の好みでは十分に機能しますが、代替案 (#15) を喜んで検討したいと思います。
ベンチマーク
(#16)
このような素晴らしい開発環境を作ってくれた Rust コミュニティに感謝したいと思います。今まで働いてきた中で最高の環境です!
Andrew Gallant の多大な功績と、彼が作成した貴重なクレート (Lolcate が依存している) (正規表現、無視、walkdir) に多大な感謝を申し上げます。
Lolcate が現在使用している、パフォーマンスを目的としてデータベースを更新するのではなく、単純にデータベースを再作成するというアプローチは、インターネット上で何度も議論されています。関連するメモが見つからなかったので、提供していただける参考文献があれば喜んで共有させていただきます。
「lolcate」という名前は、2012 年に Github Gist として公開されたプロトタイプのシェル スクリプトにすでに使用されています。あまりにも良い名前だったので、再利用しないわけにはいきません。
笑う猫の画像のクレジット: Rikki's Refuge