Uma maneira comicamente rápida de indexar e consultar seu sistema de arquivos. Substitui localizar/mlocate/atualizadob. Escrito em ferrugem.
Lolcate é uma alternativa rápida, leve e versátil para localizar/mlocate/atualizadob.
Possui:
Lolcate vem como um único executável binário.
Lolcate não tenta ser compatível com mlocate/freshb.
Lolcate opera em duas fases:
Ele indexa partes do seu sistema de arquivos obedecendo a algumas regras de indexação que você especificou para preencher um de seus bancos de dados com a lista de nomes de caminhos correspondentes.
Apenas os nomes dos caminhos dos arquivos são indexados, Lolcate não se preocupa com seu conteúdo.
Diferentes bancos de dados podem ser criados para diferentes finalidades.
Sempre que necessário, você pode executar o lolcate para realizar consultas em seus bancos de dados e ele retornará os nomes dos caminhos que correspondem às regras de consulta especificadas.
O mesmo executável binário lolcate
executa indexação e consulta.
Use aliases e funções de shell para consultar seus bancos de dados de acordo com sua preferência, por exemplo
alias d= ' lolcate --db documents '
alias zik= ' lolcate --db music --type audio '
z (){ mpv --playlist <( zik $1 ) ; }
zs (){ mpv --playlist <( zik $1 | shuf ) ; }
Criando um banco de dados
Antes de usar o Lolcate, um banco de dados precisa ser criado. Vamos criar um:
$ 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
Como não especificamos o nome do banco de dados, Lolcate escolheu o nome default
. Poderíamos ter especificado o nome do banco de dados usando lolcate --create --db <db_name>
.
Regras de indexação: especificando o que indexar
Em seguida, precisamos especificar o que indexar editando dois arquivos (isso pode mudar em uma versão futura), o arquivo config.toml
e o arquivo ignores
.
O arquivo config.toml
não vem vazio, mas preenchido com conteúdo padrão que você precisará personalizar. Deveria ficar assim:
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
Vamos modificá-lo e adicionar dois diretórios para indexação:
dirs = [
"~/Images",
"~/Documents"
]
Como você notou, os diretórios devem estar entre aspas e separados por vírgulas. Além disso, os tils nos diretórios são expandidos, mas não as variáveis de ambiente.
Podemos optar por indexar apenas arquivos definindo skip = "Dirs"
e apenas diretórios definindo skip = "Files"
. Além disso, links simbólicos e arquivos e diretórios ocultos podem ser ignorados definindo ignore_symlinks = true
e ignore_hidden = true
respectivamente.
O arquivo ignores
contém padrões que Lolcate usará para ignorar nomes de caminhos correspondentes ao indexar o sistema de arquivos. A sintaxe do arquivo ignores
é a mesma dos arquivos .gitignore. Você pode deixar em branco se quiser indexar tudo de acordo com o arquivo config.toml
.
Vamos modificá-lo e adicionar estes dois padrões:
.git
*~
Indexando o sistema de arquivos
Agora estamos prontos para dizer ao Lolcate para indexar o sistema de arquivos de acordo com as regras que acabamos de especificar:
$ lolcate --update
Updating default...
Novamente, Lolcate atualiza o banco de dados default
por padrão. Podemos optar por atualizar outro digitando lolcate --update --db <other_db>
. Também podemos pedir ao Lolcate para atualizar todos os bancos de dados que temos digitando lolcate --update --all
.
Consultando um banco de dados
Agora que nosso banco de dados está preenchido, podemos executar consultas nele.
A forma mais simples é apenas 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
(...)
Quando nenhum padrão é fornecido, a consulta retorna tudo do banco de dados.
lolcate --all
retornará tudo de todos os seus bancos de dados.
Também podemos querer especificar um padrão executando 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
(...)
Os padrões são interpretados como expressões regulares.
Por exemplo, vamos procurar nomes de caminho que contenham 2018 ou 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
(...)
A sintaxe completa do mecanismo regex usado pelo Lolcate está disponível aqui.
Vários padrões podem ser especificados usando lolcate <pattern1> <pattern2> ...
.
Por exemplo, vamos procurar todos os arquivos leia-me no diretório Imagens:
$ lolcate Images readme
/home/ngirard/Images/DCIM_101CANON/readme.txt
/home/ngirard/Images/2019/01/1/Readme
/home/ngirard/Images/2018/01/1/readme
A busca por padrões é "smart-case" por padrão. Isso significa que os padrões são pesquisados sem distinção entre maiúsculas e minúsculas, quando todos estão em letras minúsculas, e com sensibilidade, caso contrário.
Por exemplo, executar a consulta mais recente com "Readme" em vez de "readme" fornece:
$ lolcate Images Readme
/home/ngirard/Images/2019/01/1/Readme
Podemos realizar uma pesquisa sem distinção entre maiúsculas e minúsculas usando -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
Um padrão pode ser comparado apenas ao nome base dos nomes de caminho, usando o -b | --basename
opção -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
Os tipos de caminho podem ser definidos e consultados.
Os tipos de caminho podem ser definidos adicionando-os ao arquivo de configuração global do Lolcate. Podemos localizar este arquivo invocando a opção --info
:
$ lolcate --info
Config file:
/home/ngirard/.config/lolcate/config.toml
(...)
Os seguintes tipos de caminho são predefinidos:
[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)$"
estes tipos de caminho podem ser usados em consultas:
$ 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
Padrões de nomes de caminho, padrões de nomes básicos e padrões de tipos podem ser misturados:
$ 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
os arquivos de configuração são armazenados em $XDG_CONFIG_HOME/lolcate
ou em $HOME/.config/lolcate
;
os arquivos do banco de dados são armazenados em $XDG_DATA_HOME/lolcate
ou em $HOME/.local/share/lolcate
.
mlocate
As seguintes opções de localização não têm equivalente no Lolcate: --count
, --existing
, --follow
, --transliterate
, --limit
, --nofollow
, --null
.
Esta é a maneira mais fácil e recomendada.
Baixe o binário pré-compilado lolcate
mais recente do Github em um diretório pertencente ao seu PATH
.
Binários pré-compilados estão disponíveis para Linux, MacOS e Windows.
Se necessário, instale a versão estável atual do Rust e Cargo usando
$ curl https://sh.rustup.rs -sSf | sh
Se necessário, adicione ~/.cargo/bin
ao seu PATH
usando, por exemplo:
$ export PATH= $HOME /.cargo/bin: $PATH
Correr
$ cargo install lolcate-rs
para compilar os fontes da versão mais recente, ou
$ cargo install --git https://github.com/ngirard/lolcate-rs
para compilar a versão mais recente das fontes do repositório GitHub.
Embora todas as contribuições sejam bem-vindas, as contribuições ideais para mim seriam pull requests refinadas, pois me permitiriam melhorar meu conhecimento sobre Rust enquanto as revisava. Desde já, obrigado !
Existem várias áreas para as quais você pode querer considerar contribuir:
O recurso mais necessário é a impressão colorida de combinações de padrões (#13).
Lolcate ainda não pode ser usado como biblioteca.
Não estou satisfeito com o fato de as regras de ignorar serem mantidas em um arquivo de configuração separado (#14).
Testando.
Eu estaria muito interessado em conselhos sobre o código existente que eu poderia reutilizar/aproveitar para fornecer ao Lolcate uma bancada de testes completa.
Estratégia de back-end.
Lolcate atualmente armazena seus dados como uma lista de nomes de caminhos compactada em lz4 e os recria cada vez que lolcate --update
é executado. É o mais simples possível. Embora funcione bem para o meu gosto, ficaria feliz em considerar alternativas (# 15).
Comparativo de mercado
(#16)
Desejo agradecer à comunidade Rust por produzir um ambiente de desenvolvimento tão excelente. É o melhor ambiente com o qual trabalhei até agora!
Um grande obrigado a Andrew Gallant por seu tremendo trabalho e pelas valiosas caixas que ele escreveu, nas quais Lolcate se baseia (regex, ignore, walkdir).
A abordagem de simplesmente recriar o banco de dados em vez de atualizá-lo para fins de desempenho, que o Lolcate usa atualmente, foi discutida diversas vezes na Internet. Não consegui encontrar minhas notas relacionadas, então ficarei feliz em compartilhar quaisquer referências que você possa fornecer.
O nome "lolcate" já foi usado para um protótipo de script de shell publicado como Github Gist em 2012. Era um nome bom demais para não reutilizá-lo!
Créditos pela imagem do gato rindo: Refúgio de Rikki