Комично быстрый способ индексации и запроса вашей файловой системы. Заменяетlocate/mlocate/updateb. Написано на Русте.
Lolcate — быстрая, легкая и универсальная альтернатива поиску/mlocate/updateb.
Он имеет:
Lolcate представляет собой один двоичный исполняемый файл.
Lolcate не пытается быть совместимым с mlocate/updateb.
Lolcate работает в два этапа:
Он индексирует части вашей файловой системы, подчиняясь некоторым правилам индексирования, которые вы указали для заполнения одной из своих баз данных списком совпадающих имен путей.
Индексируются только пути к файлам, Lolcate не интересуется их содержимым.
Различные базы данных могут быть созданы для разных целей.
При необходимости вы можете запустить locate для выполнения запросов к своим базам данных, и он вернет имена путей, соответствующие указанным вами правилам запроса .
Один и тот же двоичный исполняемый файл 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
.
Файл 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 обновить все имеющиеся у нас базы данных, набрав lolcate --update --all
.
Запрос к базе данных
Теперь, когда наша база данных заполнена, мы можем выполнять к ней запросы.
Самая простая форма — это просто 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> ...
.
Например, давайте найдем все файлы readme в каталоге 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
По умолчанию поиск шаблонов осуществляется в «умном регистре». Это означает, что поиск по шаблонам осуществляется без учета регистра, если все строчные буквы, и с учетом в противном случае.
Например, запуск последнего запроса с «Readme» вместо «readme» дает:
$ lolcate Images Readme
/home/ngirard/Images/2019/01/1/Readme
Мы можем выполнить поиск без учета регистра, используя -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
опция:
$ 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 and 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 за создание такой великолепной среды разработки. Это лучшая среда, с которой я когда-либо работал!
Большое спасибо Эндрю Галланту за его огромную работу и написанные им бесценные ящики, на которые опирается Lolcate (regex, ignore, walkdir).
Подход простого воссоздания базы данных вместо ее обновления в целях повышения производительности, который в настоящее время использует Lolcate, неоднократно обсуждался в Интернете. Я не смог найти соответствующие заметки, поэтому буду рад поделиться любыми ссылками, которые вы можете предоставить.
Имя «lolcate» уже использовалось для прототипа сценария оболочки, опубликованного на Github Gist в 2012 году. Это было слишком хорошее имя, чтобы не использовать его повторно!
Авторы изображения смеющегося кота: Приют Рикки.