#regex #indexing #replace #file-search #locate #filesystem-indexer #lolcate

app lolcate-rs

一种有趣快速的文件系统索引和查询方法。替代 locate / mlocate / updatedb。

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文件系统

GPL-3.0 许可证

91KB
599

Lolcate

Crates.io

一种有趣快速的文件系统索引和查询方法。替代 locate / mlocate / updatedb。用 Rust 编写。

Lolcate 是 locate / mlocate / updatedb 的快速、轻量级、多功能的替代品。

它具有以下特性

  • 索引规则,允许您轻松指定要索引的路径名以及要剪枝的路径名;
  • 强大的、UTF8 兼容的 查询规则
  • 能够为多个目的创建多个 数据库

Lolcate 以单个二进制可执行文件的形式提供。

Lolcate 不试图与 mlocate / updatedb 兼容。

概要

Lolcate 运作在两个阶段

  1. 它通过遵守您指定的某些 索引规则 来索引您文件系统的一部分,将匹配的路径名列表填充到其数据库之一。

    只索引文件的路径名,Lolcate 不关心其内容。

    可以为不同的目的创建不同的数据库。

  2. 需要时,您可以运行 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 = trueignore_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 []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 []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。

从源安装

  1. 如果需要,使用以下命令安装当前稳定版本的Rust和Cargo:Rust和Cargo的安装

    $ curl https://sh.rustup.rs -sSf | sh
    
  2. 如果需要,使用例如以下命令将 ~/.cargo/bin 添加到您的 PATH

    $ export PATH=$HOME/.cargo/bin:$PATH
    
  3. 运行

    $ 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