Un moyen comiquement rapide d’indexer et d’interroger votre système de fichiers. Remplace localiser/mlocate/mis à jourb. Écrit en rouille.
Lolcate est une alternative rapide, légère et polyvalente pour localiser / mlocate / updateb.
Il comporte :
Lolcate se présente sous la forme d'un seul exécutable binaire.
Lolcate n'essaie pas d'être compatible avec mlocate / updateb.
Lolcate fonctionne en deux phases :
Il indexe des parties de votre système de fichiers en obéissant à certaines règles d'indexation que vous avez spécifiées pour remplir l'une de ses bases de données avec la liste des noms de chemin correspondants.
Seuls les chemins des fichiers sont indexés, Lolcate ne se soucie pas de leur contenu.
Différentes bases de données peuvent être créées à des fins différentes.
Chaque fois que nécessaire, vous pouvez exécuter lolcate pour effectuer des requêtes sur ses bases de données et il renverra les noms de chemin correspondant aux règles de requête que vous avez spécifiées.
Le même exécutable binaire lolcate
effectue à la fois l'indexation et l'interrogation.
Utilisez des alias et des fonctions shell pour interroger vos bases de données à votre guise, par exemple
alias d= ' lolcate --db documents '
alias zik= ' lolcate --db music --type audio '
z (){ mpv --playlist <( zik $1 ) ; }
zs (){ mpv --playlist <( zik $1 | shuf ) ; }
Création d'une base de données
Avant d'utiliser Lolcate, une base de données doit être créée. Créons-en un :
$ 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
Comme nous n'avons pas précisé le nom de la base de données, Lolcate a choisi le nom default
. Nous aurions pu spécifier le nom de la base de données en utilisant lolcate --create --db <db_name>
.
Règles d'indexation : spécifier ce qu'il faut indexer
Ensuite, nous devons spécifier ce qu'il faut indexer en éditant deux fichiers (cela pourrait changer dans une future version), le fichier config.toml
et le fichier ignores
.
Le fichier config.toml
n'est pas vide mais rempli de contenu passe-partout que vous devrez personnaliser. Cela devrait ressembler à ceci :
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
Modifions-le et ajoutons deux répertoires pour l'indexation :
dirs = [
"~/Images",
"~/Documents"
]
Comme vous l'avez remarqué, les répertoires doivent être cités et séparés par des virgules. De plus, les tildes dans les répertoires sont développés, mais pas les variables d'environnement.
Nous pouvons choisir d'indexer uniquement les fichiers en définissant skip = "Dirs"
, et uniquement les répertoires en définissant skip = "Files"
. De plus, les liens symboliques et les fichiers et répertoires cachés peuvent être ignorés en définissant respectivement ignore_symlinks = true
et ignore_hidden = true
.
Le fichier ignores
contient des modèles que Lolcate utilisera pour ignorer les noms de chemin correspondants lors de l'indexation du système de fichiers. La syntaxe du fichier ignores
est la même que celle des fichiers .gitignore. Vous pouvez le laisser vide si vous souhaitez tout indexer selon le fichier config.toml
.
Modifions-le et ajoutons ces deux modèles :
.git
*~
Indexation du système de fichiers
Maintenant, nous sommes prêts à dire à Lolcate d'indexer le système de fichiers selon les règles que nous venons de spécifier :
$ lolcate --update
Updating default...
Encore une fois, Lolcate met à jour la base de données par default
par défaut. Nous pouvons choisir d'en mettre à jour un autre en tapant lolcate --update --db <other_db>
. Nous pouvons également demander à Lolcate de mettre à jour toutes les bases de données dont nous disposons en tapant lolcate --update --all
.
Interroger une base de données
Maintenant que notre base de données est remplie, nous pouvons y exécuter des requêtes.
La forme la plus simple est simplement 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
(...)
Lorsqu'aucun modèle n'est donné, la requête renvoie tout ce qui provient de la base de données.
lolcate --all
renverra tout ce qui provient de toutes vos bases de données.
Nous pourrions également vouloir spécifier un modèle en exécutant 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
(...)
Les modèles sont interprétés comme des expressions régulières.
Par exemple, recherchons tous les noms de chemin contenant 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
(...)
La syntaxe complète du moteur regex utilisé par Lolcate est disponible ici.
Plusieurs modèles peuvent être spécifiés en utilisant lolcate <pattern1> <pattern2> ...
.
Par exemple, recherchons tous les fichiers Lisez-moi du répertoire 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
La recherche de modèles est "smart-case" par défaut. Cela signifie que les modèles sont recherchés sans tenir compte de la casse lorsqu'ils sont tous en minuscules, et avec sensibilité dans le cas contraire.
Par exemple, exécuter la dernière requête avec "Readme" au lieu de "readme" donne :
$ lolcate Images Readme
/home/ngirard/Images/2019/01/1/Readme
Nous pouvons effectuer une recherche insensible à la casse en utilisant le -i | --case-insensitive
--option -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
Un modèle peut être comparé au nom de base des noms de chemin uniquement, en utilisant l' -b | --basename
Option -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
Les types de chemin peuvent être définis et interrogés.
Les types de chemins peuvent être définis en les ajoutant au fichier de configuration globale de Lolcate. Nous pouvons localiser ce fichier en appelant l'option --info
:
$ lolcate --info
Config file:
/home/ngirard/.config/lolcate/config.toml
(...)
Les types de chemin suivants sont prédéfinis :
[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)$"
ces types de chemin peuvent être utilisés dans les requêtes :
$ 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
Les modèles de nom de chemin, les modèles de nom de base et les modèles de type peuvent être mélangés :
$ 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
les fichiers de configuration sont stockés soit dans $XDG_CONFIG_HOME/lolcate
, soit dans $HOME/.config/lolcate
;
les fichiers de base de données sont stockés soit dans $XDG_DATA_HOME/lolcate
, soit dans $HOME/.local/share/lolcate
.
mlocate
Les options de localisation suivantes n'ont pas d'équivalent dans Lolcate : --count
, --existing
, --follow
, --transliterate
, --limit
, --nofollow
, --null
.
C’est la méthode la plus simple et recommandée.
Téléchargez le dernier binaire précompilé lolcate
depuis Github dans un répertoire appartenant à votre PATH
.
Des binaires précompilés sont disponibles pour Linux, MacOS et Windows.
Si nécessaire, installez la version stable actuelle de Rust et Cargo en utilisant
$ curl https://sh.rustup.rs -sSf | sh
Si nécessaire, ajoutez ~/.cargo/bin
à votre PATH
en utilisant par exemple :
$ export PATH= $HOME /.cargo/bin: $PATH
Courir
$ cargo install lolcate-rs
pour compiler les sources de la dernière version, ou
$ cargo install --git https://github.com/ngirard/lolcate-rs
pour compiler la dernière version des sources du référentiel GitHub.
Bien que toutes les contributions soient les bienvenues, les contributions idéales pour moi seraient des demandes d'extraction fines, car elles me permettraient d'améliorer mes connaissances sur Rust tout en les examinant. Merci d'avance !
Il existe un certain nombre de domaines auxquels vous pourriez envisager de contribuer :
La fonctionnalité la plus nécessaire est l’impression couleur des correspondances de motifs (#13).
Lolcate n'est pas encore utilisable comme bibliothèque.
Je ne suis pas satisfait du fait que les règles d'ignorance soient conservées dans un fichier de configuration séparé (#14).
Essai.
Je serais très intéressé par des conseils sur du code existant que je pourrais réutiliser/exploiter afin de doter Lolcate d'un banc de test complet.
Stratégie back-end.
Lolcate stocke actuellement ses données sous la forme d'une liste de noms de chemin compressée en lz4 et les recrée à chaque fois que lolcate --update
est exécuté. C'est aussi simple que possible. Bien que cela fonctionne assez bien à mon goût, je serais heureux d'envisager des alternatives (#15).
Analyse comparative
(#16)
Je tiens à remercier la communauté Rust pour avoir produit un environnement de développement aussi formidable. C'est le meilleur environnement avec lequel j'ai travaillé jusqu'à présent !
Un grand merci à Andrew Gallant pour son formidable travail et les précieuses caisses qu'il a écrites, sur lesquelles Lolcate s'appuie (regex, ignore, walkdir).
L'approche consistant à simplement recréer la base de données au lieu de la mettre à jour à des fins de performances, que Lolcate utilise actuellement, a été discutée à plusieurs reprises sur Internet. Je n'ai pas trouvé mes notes associées, je serais donc heureux de partager toutes les références que vous pourriez fournir.
Le nom "lolcate" a déjà été utilisé pour un prototype de script shell publié comme Github Gist en 2012. C'était un trop beau nom pour ne pas le réutiliser !
Crédits pour l'image du chat qui rit : Rikki's Refuge