Dateien mit Attributen

  Ralf Hersel   Lesezeit: 8 Minuten  🗪 3 Kommentare

Wer Dateien mit eigenen Attributen versehen möchte, kann dafür die Extended File Attributes verwenden.

dateien mit attributen

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:

  1. user
  2. trusted
  3. security
  4. 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/

https://en.wikipedia.org/wiki/Extended_file_attributes

Tags

Datei, Dateien, Attribute, xattr, Tagging, Tags

SaGrLand
Geschrieben von SaGrLand am 30. Januar 2023 um 17:30

War bei den Extended File Attributes nicht das Problem, dass es programmabhängig ist, ob die beim Bearbeiten erhalten bleiben (oder weg sind, weil das Programm beim Speichern die alte Datei löscht und eine neue mit gleichem Namen anlegt)?

Ralf Hersel
Geschrieben von Ralf Hersel am 1. Februar 2023 um 22:50

Guter Punkt. Habe das gerade überprüft. Ja, es stimmt. Nach einer Änderung der Datei sind die Attribute weg. So ein Mist. Viele Stunden umsonst gearbeitet.

kamome
Geschrieben von kamome am 5. Februar 2023 um 14:01

Z. B. im Falle von vi(m) ließe sich das zwar mit set backupcopy=yes lösen, aber es bleibt leider ein sehr anfälliges System.