Document ID: /fineweb-2-swissfilter-quality_10-filterrobots/filtered/03162.jsonl.gz/740

Dateien mit Attributen
Mo, 30. Januar 2023, Ralf Hersel
Dieser Beitrag wurde von meiner Tochter inspiriert: "Papa, kann ich Dateien markieren (z. B. mit einer Farbe)? Damit ich ordnen kann, welche Dateien ich schon gelesen habe und welche nicht und das auf einen Blick sehe, wenn ich im entsprechenden Ordner bin." Sie arbeitet mit GNOME, weshalb ich zuerst die Favoriten-Sterne in Nautilus empfohlen habe. Als weitere Lösung brachte ich das "Prefixen" der Dateinamen ins Spiel: aus Dokument.pdf wird X_Dokument.pdf. Das hat sie dann als genügende Lösung verwendet. Doch wir wären nicht GNU/Linux, wenn es nicht noch viel besser und ganz anders geht.
Bereits im November hat Lioh über die Anwendung Tagspaces geschrieben. Mit diesem Werkzeug lassen sich Dateien verschlagworten. Dies geschieht über Namensänderung oder einer zweiten JSON-Datei pro Originaldatei, in der die Tags gespeichert werden. Das fand ich schon im letzten Jahr nicht besonders elegant. Ausserdem ist Tagspaces ein Electron-Monster (will man nicht haben). Es gibt auch Dateimanager (Dolphin), die die Verschlagwortung direkt unterstützten. In diesem Artikel möchte ich zeigen, dass es auch mit Bordmitteln geht.
So gut wie alle Linux-Dateisysteme bieten mit den Extended File Attributes eine Lösung für diesen Anwendungsfall.
Bevor ich mit Beispielen loslege, kommt hier die genaue Beschreibung des Use Cases:
- Dateien sollen mit benutzerdefinierten Attributen versehen werden
- Diese Attribute soll man setzen und wieder entfernen können
- Die Attribute soll dargestellt werden können und man soll nach ihnen suchen können
- Das Setzen von Attributen soll vom Dateisystem unterstützt werden, ohne Zusatzwerkzeuge verwenden zu müssen
Als Testumgebung erstellen wir drei Dateien in einem eigenen Verzeichnis: a.txt, b.txt, c.txt. Der Inhalt dieser Dateien ist egal. Nun wollen wir die Dateien mit eigenen Attributen versehen:
setfattr -n user.comment -v "gelesen" a.txt setfattr -n user.comment -v "nicht gelesen" b.txt setfattr -n user.color -v "rot" c.txt
Der POSIX-Standard definiert vier Namensräume, für diese erweiterten Datei-Attribute, nämlich:
- user
- trusted
- security
- system
Uns interessiert nur der Erste (user); von den anderen lassen wir die Finger. Der Namespace user kann um eigene Attribute erweitert werden. Das seht ihr im oben gezeigten Beispiel. Mit dem Befehl setfattr (set file attribute) wird einer Datei ein Wert für ein Namespace-Attribut zugewiesen. Der Parameter -n leitet den Namespace ein und mit dem Parameter -v setzt ihr einen Wert (value) für das Namespace-Attribut. Zum Schluss steht der Dateiname, damit setfattr weiss, für welche Datei das Attribut gesetzt werden soll.
In diesem Moment stellen sich viele Fragen. Wie weiss ich, welche Namespace-Attribute vorhanden sind? Wie sehe ich, welche Werte insgesamt verwendet werden? Dazu gebe ich keine Antworten, weil der Artikel sonst zu lang wird. Im Beispiel verwende ich zwei Attribute im Namespace 'user', nämlich 'comment' und 'color'. Bei der Wahl seid ihr frei; "Schuhgrösse" ist auch möglich:
setfattr -n user.schuhgroesse -v "43" c.txt
Falls ihr eines der Attribute mit setfattr überschreibt, wird der neue Wert gesetzt und nicht etwa angehangen. Ein bestimmtes Attribut kann man mit diesem Befehl auslesen:
getfattr -n user.comment b.txt # file: b.txt user.comment="nicht gelesen"
Mit getfattr lasst ihr den Wert eines benannten Attributes anzeigen. Möchtet ihr alle Attribute für eine bestimmte Datei sehen, geht das mit dem Parameter -d:
getfattr -d c.txt # file: c.txt user.color="rot" user.schuhgroesse="43"
Laut Spezifikation sollte das ls Kommando mit der Parameter -X eigentlich mit den Extended File Attributes umgehen können, was bei mir jedoch nicht funktioniert hat. Kann sein, dass ich es falsch angewendet habe. Daher habe ich eine Pipe verwendet, um mir alle Attribute bei einer Dateiliste anzeigen zu lassen:
ls | xargs getfattr -d # file: a.txt user.comment="gelesen" # file: b.txt user.comment="nicht gelesen" # file: c.txt user.color="rot" user.schuhgroesse="43"
Wer möchte, kann auch nur auf einen Namespace abfragen:
ls | xargs getfattr -n user.color a.txt: user.color: Kein solches Attribut b.txt: user.color: Kein solches Attribut # file: c.txt user.color="rot"
Bei der Suche nach Dateien, die ein Attribut mit einem bestimmten Wert gesetzt haben, wird es schon schwieriger. Angenommen, ihr möchtet nach allen Dateien im Verzeichnis suchen, denen das Attribut: user.color=rot zugewiesen wurde, geht ihr so vor:
getfattr -R -d . | grep -B 2 "rot" # file: c.txt user.color="rot"
Das -B 2 bewirkt, dass auch die zwei vorherigen Zeilen ausgegeben werden, damit auch der Dateiname sichtbar wird. Das funktioniert nicht gut, wenn eine Datei mehrere Attribute hat, weil dann der Dateiname nicht mehr zu sehen ist.
Das ist ja alles schön und gut, aber für den täglichen Umgang jedoch völlig ungeeignet! Diesem Einwand stimme ich zu. Man kann die Aufgabe benutzerfreundlicher gestalten, indem man Aliase in der .bashrc oder .zshrc einrichtet. Denkbar wären diese Aliase:
- settag - setzt (oder überschreibt) ein Attribut mit einem Wert auf einer Datei
- gettag - zeigt die Attribute mit ihren Werten für eine Datei
- lstag - zeigt alle Attribute mit ihren Werten in einem Verzeichnis
- findtag - sucht nach Werten in einem Verzeichnis
- deltag - entfernt ein Attribut von der Datei
Der Code für die Shell-Konfigurationsdatei (.bashrc, .zshrc, usw.) könnte beispielsweise so aussehen:
# Example: settag color red a.txt function settag() { setfattr -n user.$1 -v $2 $3 } # Example: gettag a.txt function gettag() { getfattr -d $1 } # Example: findtag search_string function findtag() { getfattr -R -d . | grep -B 2 $1 } # Example: deltag color a.txt function deltag() { setfattr -x user.$1 $2 } # Example: lstag alias lstag='getfattr -R -d .'
Noch schöner wäre es, wenn der Dateimanager deiner Wahl mit diesen Befehlen erweitert würde. Fast alle Dateimanager ermöglichen die Erweiterung durch Shell-Skripte. Dolphin kann es; allen anderen könnt ihr es beibringen.
Update
Ein Kommentator hat darauf hingewiesen, dass die Attribute nach der Bearbeitung einer Datei verloren gehen. Schade. Es wäre auch zu schön gewesen.
Quellen:
https://www.linuxtoday.com/blog/linux-extended-file-attributes/