一种快速索引和查询文件系统的方法。取代locate/mlocate/updatedb。用 Rust 编写。
Lolcate 是一个快速、轻量级、多功能的locate/mlocate/updatedb 替代品。
其特点:
Lolcate 作为单个二进制可执行文件出现。
Lolcate 不会尝试与 mlocate / Updatedb 兼容。
Lolcate 的运营分两个阶段:
它通过遵循您指定的一些索引规则来索引文件系统的各个部分,以使用匹配路径名列表填充其数据库之一。
仅对文件的路径名进行索引,Lolcate 不关心其内容。
可以为不同的目的创建不同的数据库。
无论何时需要,您都可以运行 locate 来对其数据库执行查询,它将返回与您指定的查询规则匹配的路径名。
相同的lolcate
二进制可执行文件执行索引和查询。
使用 shell 别名和函数根据您的喜好查询数据库,例如
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
文件。
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
我们来修改它并添加两个目录用于索引:
dirs = [
"~/Images",
"~/Documents"
]
正如您所注意到的,目录必须用引号引起来并以逗号分隔。此外,目录中的波形符会扩展,但环境变量不会扩展。
我们可以通过设置skip = "Dirs"
选择仅索引文件,通过设置skip = "Files"
选择仅索引目录。此外,可以通过分别设置ignore_symlinks = true
和ignore_hidden = true
来跳过符号链接和隐藏文件和目录。
ignores
文件包含 Lolcate 将在索引文件系统时用来忽略匹配路径名的模式。 ignores
文件的语法与 .gitignore 文件的语法相同。如果您想根据config.toml
文件对所有内容进行索引,可以将其留空。
让我们修改它并添加这两个模式:
.git
*~
索引文件系统
现在,我们准备告诉 Lolcate 根据我们刚刚指定的规则索引文件系统:
$ lolcate --update
Updating default...
同样,Lolcate 默认更新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 目录中查找所有自述文件:
$ lolcate Images readme
/home/ngirard/Images/DCIM_101CANON/readme.txt
/home/ngirard/Images/2019/01/1/Readme
/home/ngirard/Images/2018/01/1/readme
默认情况下,模式搜索是“smart-case”。这意味着当模式全部为小写时,将不区分大小写地搜索模式,否则将敏感地搜索模式。
例如,使用“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
。
这是最简单且推荐的方法。
从 Github 下载最新的lolcate
预编译二进制文件到属于您的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)。
Lolcate 尚不能用作库。
我对将忽略规则保存在单独的配置文件中不满意(#14)。
测试。
我对可以重用/利用现有代码的建议非常感兴趣,以便为 Lolcate 提供完整的测试平台。
后端策略。
Lolcate 当前将其数据存储为 lz4 压缩的路径名列表,并在每次运行lolcate --update
时重新创建它。它就像你能得到的一样简单。尽管它足够适合我的口味,但我很乐意考虑替代方案(#15)。
标杆管理
(#16)
我要感谢 Rust 社区创造了如此优秀的开发环境。这是我迄今为止工作过的最好的环境!
非常感谢 Andrew Gallant 的出色工作和他编写的宝贵的板条箱,Lolcate 依赖这些(正则表达式、忽略、walkdir)。
Lolcate 目前使用的只是重新创建数据库而不是出于性能目的而更新数据库的方法,已在 Internet 上多次讨论。我找不到相关笔记,因此我很乐意分享您可以提供的任何参考资料。
“lolcate”这个名字已经被用于 2012 年作为 Github Gist 发布的原型 shell 脚本。这个名字太好了,不能不重复使用它!
笑猫图片来源:Rikki's Refuge