8 个版本 (破坏性更新)
0.10.0 | 2020年12月3日 |
---|---|
0.9.2 | 2020年11月23日 |
0.8.0 | 2020年5月19日 |
0.7.0 | 2020年5月19日 |
0.4.0 | 2019年4月30日 |
#648 在 文件系统 中
91KB
599 行
Lolcate
一种有趣快速的文件系统索引和查询方法。替代 locate / mlocate / updatedb。用 Rust 编写。
Lolcate 是 locate / mlocate / updatedb 的快速、轻量级、多功能的替代品。
它具有以下特性
- 索引规则,允许您轻松指定要索引的路径名以及要剪枝的路径名;
- 强大的、UTF8 兼容的 查询规则;
- 能够为多个目的创建多个 数据库。
Lolcate 以单个二进制可执行文件的形式提供。
Lolcate 不试图与 mlocate / updatedb 兼容。
概要
Lolcate 运作在两个阶段
-
它通过遵守您指定的某些 索引规则 来索引您文件系统的一部分,将匹配的路径名列表填充到其数据库之一。
只索引文件的路径名,Lolcate 不关心其内容。
可以为不同的目的创建不同的数据库。
-
需要时,您可以运行 lolcate 来对其数据库执行查询,并将返回符合您指定的 查询规则 的路径名。
相同的 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 目录的所有 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
我们可以使用
-| --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
选项仅对路径名的基准名称进行匹配。$ 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
Lolcate存储文件的位置在哪里?
-
配置文件存储在
$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: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为其巨大的工作以及他所写的无价crates(regex、ignore、walkdir)。
-
关于Lolcate当前使用的仅仅为了性能而重新创建数据库而非更新数据库的方法,已经在互联网上讨论过多次。我找不到我相关的笔记,所以我很乐意分享你提供的任何参考资料。
-
“lolcate”这个名字已经在2012年被用作一个原型shell脚本的名称,并作为Github Gist发布。这个名字太好了,不能不重复使用!
-
感谢使用笑猫图片:Rikki's Refuge
依赖项
~7–16MB
~192K SLoC