Eine unglaublich schnelle Möglichkeit, Ihr Dateisystem zu indizieren und abzufragen. Ersetztlocate/mlocate/updateb. Geschrieben in Rust.
Lolcate ist eine schnelle, leichte und vielseitige Alternative zum Locate / Mlocate / Updatedb.
Es verfügt über:
Lolkate wird als einzelne ausführbare Binärdatei geliefert.
Lolkate versucht nicht, mit mlocate/updateb kompatibel zu sein.
Lolkate arbeitet in zwei Phasen:
Es indiziert Teile Ihres Dateisystems, indem es einige von Ihnen angegebene Indizierungsregeln befolgt, um eine seiner Datenbanken mit der Liste übereinstimmender Pfadnamen zu füllen.
Es werden nur die Pfadnamen der Dateien indiziert, Lolkate kümmert sich nicht um deren Inhalte.
Für unterschiedliche Zwecke können unterschiedliche Datenbanken erstellt werden.
Bei Bedarf können Sie lolcate ausführen, um Abfragen für seine Datenbanken durchzuführen. Es werden dann die Pfadnamen zurückgegeben, die den von Ihnen angegebenen Abfrageregeln entsprechen.
Die gleiche ausführbare Binärdatei lolcate
führt sowohl die Indizierung als auch die Abfrage durch.
Verwenden Sie Shell-Aliase und Funktionen, um Ihre Datenbanken nach Ihren Wünschen abzufragen, z
alias d= ' lolcate --db documents '
alias zik= ' lolcate --db music --type audio '
z (){ mpv --playlist <( zik $1 ) ; }
zs (){ mpv --playlist <( zik $1 | shuf ) ; }
Erstellen einer Datenbank
Vor der Verwendung von Lolkate muss eine Datenbank erstellt werden. Lassen Sie uns eines erstellen:
$ 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
Da wir den Namen der Datenbank nicht angegeben haben, hat Lolkate den Namen default
gewählt. Wir hätten den Namen der Datenbank mit lolcate --create --db <db_name>
angeben können.
Indizierungsregeln: Festlegen, was indiziert werden soll
Als Nächstes müssen wir angeben, was indiziert werden soll, indem wir zwei Dateien bearbeiten (dies könnte sich in einer zukünftigen Version ändern), die Datei config.toml
und die Datei ignores
.
Die Datei config.toml
ist nicht leer, sondern mit vorgefertigten Inhalten gefüllt, die Sie anpassen müssen. Es sollte so aussehen:
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
Ändern wir es und fügen zwei Verzeichnisse für die Indizierung hinzu:
dirs = [
"~/Images",
"~/Documents"
]
Wie Sie bemerkt haben, müssen die Verzeichnisse in Anführungszeichen gesetzt und durch Kommas getrennt werden. Außerdem werden Tilden in Verzeichnissen erweitert, nicht jedoch Umgebungsvariablen.
Wir können wählen, nur Dateien zu indizieren, indem skip = "Dirs"
festlegen, und nur Verzeichnisse, indem wir skip = "Files"
festlegen. Darüber hinaus können symbolische Links und versteckte Dateien und Verzeichnisse übersprungen werden, indem man ignore_symlinks = true
bzw. ignore_hidden = true
setzt.
Die ignores
Datei enthält Muster, die Lolkate verwendet, um übereinstimmende Pfadnamen beim Indizieren des Dateisystems zu ignorieren. Die Syntax der ignores
ist dieselbe wie für die .gitignore-Dateien. Sie können es leer lassen, wenn Sie alles gemäß der Datei config.toml
indizieren möchten.
Lassen Sie es uns ändern und diese beiden Muster hinzufügen:
.git
*~
Indizierung des Dateisystems
Jetzt können wir Lolkate anweisen, das Dateisystem gemäß den gerade angegebenen Regeln zu indizieren:
$ lolcate --update
Updating default...
Auch hier aktualisiert Lolkate standardmäßig die default
. Wir können eine andere aktualisieren, indem lolcate --update --db <other_db>
eingeben. Wir können Lolcate auch bitten, alle vorhandenen Datenbanken zu aktualisieren, indem wir lolcate --update --all
eingeben.
Abfragen einer Datenbank
Nachdem unsere Datenbank nun gefüllt ist, können wir Abfragen dafür ausführen.
Die einfachste Form ist einfach 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
(...)
Wenn kein Muster angegeben ist, gibt die Abfrage alles aus der Datenbank zurück.
lolcate --all
gibt alles aus all Ihren Datenbanken zurück.
Möglicherweise möchten wir auch ein Muster angeben, indem wir lolcate [--db <dbname>] <pattern>
ausführen:
$ 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
(...)
Muster werden als reguläre Ausdrücke interpretiert.
Suchen wir zum Beispiel nach Pfadnamen, die entweder 2018 oder 2019 enthalten:
$ 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
(...)
Die vollständige Syntax für die von Lolkate verwendete Regex-Engine finden Sie hier.
Mit lolcate <pattern1> <pattern2> ...
können mehrere Muster angegeben werden.
Suchen wir zum Beispiel nach allen Readme-Dateien im Images-Verzeichnis:
$ lolcate Images readme
/home/ngirard/Images/DCIM_101CANON/readme.txt
/home/ngirard/Images/2019/01/1/Readme
/home/ngirard/Images/2018/01/1/readme
Die Suche nach Mustern ist standardmäßig „smart-case“. Dies bedeutet, dass bei der Suche nach Mustern die Groß-/Kleinschreibung nicht beachtet wird, wenn alle in Kleinbuchstaben geschrieben sind, und ansonsten unter Beachtung der Groß-/Kleinschreibung.
Wenn Sie beispielsweise die neueste Abfrage mit „Readme“ anstelle von „Readme“ ausführen, erhalten Sie Folgendes:
$ lolcate Images Readme
/home/ngirard/Images/2019/01/1/Readme
Mit -i | --case-insensitive
können wir eine Suche ohne Berücksichtigung der Groß-/Kleinschreibung durchführen -i | --case-insensitive
Option:
$ 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
Ein Muster kann nur mit dem Basisnamen von Pfadnamen abgeglichen werden, indem -b | --basename
verwendet wird -b | --basename
Option:
$ 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
Pfadtypen können definiert und abgefragt werden.
Pfadtypen können definiert werden, indem sie zur globalen Konfigurationsdatei von Lolkate hinzugefügt werden. Wir können diese Datei finden, indem wir die Option --info
aufrufen:
$ lolcate --info
Config file:
/home/ngirard/.config/lolcate/config.toml
(...)
Folgende Pfadtypen sind vordefiniert:
[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)$"
Diese Pfadtypen können in Abfragen verwendet werden:
$ 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
Pfadnamenmuster, Basisnamenmuster und Typmuster können insgesamt gemischt werden:
$ 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
die Konfigurationsdateien werden entweder in $XDG_CONFIG_HOME/lolcate
oder in $HOME/.config/lolcate
gespeichert;
Die Datenbankdateien werden entweder in $XDG_DATA_HOME/lolcate
oder in $HOME/.local/share/lolcate
gespeichert.
mlocate
Die folgenden Locate-Optionen haben in Lolcate keine Entsprechung: --count
, --existing
, --follow
, --transliterate
, --limit
, --nofollow
, --null
.
Dies ist der einfachste und empfehlenswerteste Weg.
Laden Sie die neueste vorkompilierte Binärdatei lolcate
von Github in ein Verzeichnis herunter, das zu Ihrem PATH
gehört.
Vorkompilierte Binärdateien sind für Linux, MacOS und Windows verfügbar.
Installieren Sie bei Bedarf die aktuelle stabile Version von Rust und Cargo mit
$ curl https://sh.rustup.rs -sSf | sh
Fügen Sie bei Bedarf ~/.cargo/bin
zu Ihrem PATH
hinzu, indem Sie zum Beispiel Folgendes verwenden:
$ export PATH= $HOME /.cargo/bin: $PATH
Laufen
$ cargo install lolcate-rs
um die Quellen aus der neuesten Version zu kompilieren, oder
$ cargo install --git https://github.com/ngirard/lolcate-rs
um die neueste Version der Quellen aus dem GitHub-Repository zu kompilieren.
Während alle Beiträge willkommen sind, wären die idealen Beiträge für mich feinkörnige Pull-Requests, da sie es mir ermöglichen würden, meine Rust-Kenntnisse zu verbessern, während ich sie durchprüfe. Dank im Voraus !
Es gibt eine Reihe von Bereichen, zu denen Sie möglicherweise einen Beitrag leisten möchten:
Die am meisten benötigte Funktion ist der farbige Ausdruck von Musterübereinstimmungen (#13).
Lolkate ist noch nicht als Bibliothek nutzbar.
Ich bin nicht damit zufrieden, dass die Ignorierregeln in einer separaten Konfigurationsdatei gespeichert werden (#14).
Testen.
Ich wäre sehr an Ratschlägen zu vorhandenem Code interessiert, den ich wiederverwenden/nutzen könnte, um Lolcate eine vollständige Testumgebung zur Verfügung zu stellen.
Backend-Strategie.
Lolkate speichert seine Daten derzeit als lz4-komprimierte Liste von Pfadnamen und erstellt sie jedes Mal neu, wenn lolcate --update
ausgeführt wird. Es ist so einfach wie möglich. Obwohl es für meinen Geschmack gut genug funktioniert, würde ich gerne Alternativen in Betracht ziehen (Nr. 15).
Benchmarking
(#16)
Ich möchte der Rust-Community dafür danken, dass sie eine so großartige Entwicklungsumgebung geschaffen hat. Es ist die beste Umgebung, in der ich bisher gearbeitet habe!
Ein großer Dank geht an Andrew Gallant für seine großartige Arbeit und die unschätzbar wertvollen Crates, die er geschrieben hat und auf die sich Lolcate verlässt (Regex, Ignore, Walkdir).
Der Ansatz, die Datenbank einfach neu zu erstellen, anstatt sie aus Leistungsgründen zu aktualisieren, wie Lolkate derzeit verwendet, wurde im Internet mehrfach diskutiert. Da ich meine entsprechenden Notizen nicht finden konnte, teile ich Ihnen gerne Ihre Referenzen mit.
Der Name „lolcate“ wurde bereits für einen Prototyp eines Shell-Skripts verwendet, der 2012 als Github Gist veröffentlicht wurde. Der Name war zu gut, um ihn nicht wiederzuverwenden!
Credits für das Bild der lachenden Katze: Rikki's Refuge