Tag-basierte Dateisysteme

vorhergehende Artikel in: Linux
22.11.2017

Es existiert keine zufriedenstellende Möglichkeit, Dateien über Schlüsselworte recherchierbar zu machen - zumindestens in den von mir so bezeichneten Betriebssystemfamilien Linux und Windows. Ich habe mir eine mögliche alternative Vorgehensweise unter Linux angesehen.

Motivation

Ich habe zur Zeit Urlaub und verbringe einen Großteil der mir zur Verfügung stehenden Zeit im Garten oder führe kleinere Reparaturen im Haus aus. Die übrige Zeit bilde ich mich weiter oder lese zum Vergnügen.

In diese Zeit fiel mein Fund einer mehrteiligen Artikelreihe zum Thema Machine Learning: Dort wird in Teil 3 beschrieben, wie Bildklassifikation heutzutage funktioniert. es gibt diverse frei verfügbare Dienste, die eine API bereitstellen, um Bilder klassifizieren zu lassen. Egal, ob man diese Dienste benutzt, oder einen eigenen Dienst aufsetzt, der eine solche Kategorisierung durchführt - Es stellt sich die Frage, was man mit den Ergebnissen tun soll. Denn wenn es nicht so ist, dass man die Kategorisierung für ein Bild live durchführen will, sondern alle Bilder in einem Batch-Durchlauf mit Kategorien versieht - wohin mit den Ergebnissen: man will sie so speichern, dass man transparent und schnell darauf zugreifen und im Idealfall auch darin recherchieren kann.

Hier würden sich Tags anbieten, die einfach an die geweiligen Bilddateien "geklebt" werden könnten. Diese würden sich auch sehr leicht ergänzen und modifizieren lassen.

Vor allem möchte man auf die Informationen der Tags oder Kategorien aus verschiedenen Anwendungen heraus zugreifen können. Es ist einfach unhandlich, zur Recherche auf eine dedizierte Anwendung zurückgreifen zu müssen, die dann die Dateinamen der Kandidaten ausspuckt. Diese wiederum muss man in einem Bildbetrachter laden um über die visuelle Inspektion das passendste auszuwählen, welches dann wiederum in die Zielanwendung geladen wird. Ein Workflow, der einen solchen Namen eigentlich nicht verdient...

Dedizierte Anwendungen

Es gibt nur wenige dedizierte Anwendungen, die dieses Dilemma lösen. Manche werden auch nicht mehr weiter gepflegt - ein Beispiel dafür ist der Dateimanager Nautilus, der in früheren Versionen zumindest die Möglichkeit bot, Tags an Dateien zu verwalten.

Das Bildverwaltungsprogramm GThumb bietet Möglichkeiten, Tags zu Bilddateien zu verwalten, allerdings ist mir keine Möglichkeit bekannt, auf diese Tags außerhalb der Anwendung zuzugreifen.

TagSpaces sieht vielversprechend aus (unterstützt auf allen großen Plattformen!), bis man die Dateien mit einem anderen Dateimanager betrachtet oder in der Texteingabe ein Verzeichnislisting durchführt: Dann erkennt man nämlich, dass die Tags in den Dateinamen hineingeschrieben werden. Das ermöglicht zwar eine einfache Suche nach Tags - einfach ein entsprechendes Dateinamensmuster angeben! - aber erstens existieren auf manchen Plattformen in manchen Dateisystemen Längenbeschränkungen für Datei- oder Pfadnamen und zweitens werden Dateinamen auf diese Art und Weise sehr schnell unübersichtlich.

Dateisysteme

An dieser Stelle stieß ich auf virtuelle Dateisysteme, die sich dieses Problems annehmen wollen: TMSU stellt ein solches nur für die Recherche zur Verfügung, während das Hinzufügen von Tags über ein spezielles Werkzeug erfolgt.

Tagsistant geht noch einen Schritt weiter - hier geschieht auch das Hinzufügen von Tags über das virtuelle Dateisystem. Laut dem Github-Repository hat sich an dem Projekt seit 2014 nichts mehr getan - ich habe es trotzdem versucht und schildere hier mal meine Erkenntnisse:

Tagsistent in-depth

Installation unter Ubuntu Version 16.04

Das war etwas komplexer als ich angenommen hatte - ich habe dazu das Git-Repository benutzt und musste nach dem Pull zunächst ein wenig Kosmetik betreiben: im Repository liegen einige symbolische Links, deren Ziele auf meinem System nicht vorhanden waren - unter anderem, weil sie sich auf spezifische Versionen diverser Werkzeuge beziehen, die in Ubuntu 16.04 nicht mehr verfügbar sind (Beispiel: automake 1.14)

Weiterhin musste ich einige weitere Softwarepakete installieren (meines Tests fanden mit sqlite3 als Backend statt - andere Datenbanken, beispielsweise MySQL habe ich noch nicht untersucht).

git clone https://github.com/StrumentiResistenti/Tagsistant.git tagsistant
cd tagsistant/
ln -s /usr/share/automake-1.15 /usr/share/automake-1.14
ln -s /usr/share/libtool/build-aux/ /usr/share/libtool/config
apt-get install libdbi1
apt-get install libdbi-dev
apt-get install libextractor-dev
apt-get install libdbd-sqlite3
./autogen.sh
./configure
make -j 5
make install

Taggen

Das ist so einfach, wie eine Datei in ein Verzeichnis zu kopieren: Jeder Tag existiert im Verzeichnis namens store als Unterverzeichnis - kopiert man eine Datei in eines dieser Verzeichnisse, erhält sie den entsprechenden Tag. Kopiert man die Datei in mehrere dieser Unterverzeichnisse, erhält sie alle diese Tags. Löscht man eine Datei aus einem dieser Verzeichnisse, hat sie das Tag entsprechend nicht mehr. Auch Umbewegen zwischen zwei Verzeichnissen unterhalb von store ist möglich - damit entfernt man ein Tag und ersetzt es durch ein anderes. Allerdings ist hier ein wenig Obacht geboten!

Neue Tags werden angelegt, indem man ein entsprechendes verzeichnis unterhalb des Unterverzeichnisses namens tags anlegt.

Tags werden gelöscht, indem man das entsprechende Verzeichnis unterhalb von tags löscht.

Will man Tagsistent nur fürs Taggen benutzen und die Dateien an einem anderen Ort traditionell in einer Verzeichnisstruktur organisieren, ist auch das möglich: Statt des Kopierens ins virtuelle Dateisystem kann man Dateien auch Tags zuordnen, indem man symbolische Links erstellt.

Achtung!

Hat man Dateien, die den gleichen Namen haben, aber in anderen Pfaden untergebracht sind, kann man auf folgendes Problem stoßen: Nachdem man die erste Datei in eines der Tags-Verzeichnisse kopiert hat, kann man die zweite nicht mit demselben Tag versehen - in dem Tag-Verzeichnis existiert ja bereits eine mit diesem Namen.

In diesem Fall muss man sich also etwas überlegen...

Benutzen der Lösung als Tags, nicht als Archiv

Wie im vorhergehenden Absatz angedeutet, kann man das virtuelle Dateisystem unter anderem dafür benutzen, die Dateien auch zu archivieren - damit existieren sie nur innerhalb des virtuellen Dateisystems. Man kann es aber auch nur zun Taggen benutzen - die Dateien existieren an einem anderen Ort und das virtuelle Dateisystem enthält nur Verweise: symbolische Links.

Dies ist die von mir präferierte Variante - allerdings müssen folgende Herausforderungen gemeistert werden:

Namenskollisionen vermeiden

Das kann dadurch erreicht werden, dass als Name des symbolischen Links nicht der Name der Ursprungsdatei benutzt wird, sondern ein kryptographischer Hash über den gesamten Dateinamen - einschließlich des vollständigen Pfades - der Ursprungsdatei (natürlich ergänzt um die korrekte Dateinamensendung).

Ermitteln aller Tags einer Datei

Dies ist wichtig, um später gezielt weitere Tags hinzufügen zu können. Man muss also in der Lage sein, für eine beliebige Datei im Archiv zu ermitteln, welche Tags bereits dafür existieren. Unter der Vorasusetzung, dass die Namen der symbolischen Links im virtuellen Dateisystem wie im vorhergehenden Abschnitt beschrieben erzeugt werden, kann man für eine Datei über die Berechung des Namens des Verweises mit den Mitteln von Tagsistant auf die Liste der dieser Datei zugeordneten Tags zugreifen.

Ermitteln der archivierten Datei

Das ist trivial - dazu muss man nur das Ziel des Verweises ermitteln. Das funktioniert mit puren Bordmitteln - unabhängig von Tagsistant.

Perks

Darüber hinaus existieren weitere Highlights, wie etwa eine komfortable Abfragesprache über Pfade des virtuellen Dateisystems, sogenannte Machine Tags zur hierarchischen Organisation von Tags, Relationen zur Abbildung von Beziehungen zwischen Tags und die Möglichkeit oft benutzte Abfragen als Aliases zu speichern, um nur einige zu nennen.

Artikel, die hierher verlinken

Komponente zur Verwaltung von Tags

26.11.2017

Ich habe eine Komponente erstellt, die die GUI für die Verwaltung von Tags darstellen könnte. Damit wäre etwa eine Möglichkeit geschaffen, eine komfortable Anwendung zur Verwaltung Tag-basierter Dateisysteme zu erstellen

Alle Artikel rss Wochenübersicht Monatsübersicht Github Repositories Gitlab Repositories Mastodon Über mich home xmpp


Vor 5 Jahren hier im Blog

  • Certstream, InfluxDB, Grafana und Netflix

    16.04.2019

    Nachdem ich vor kurzem über mein erstes Spielen mit dem certstream berichtete, habe ich weitere Experimente gemacht und die Daten zur besseren Auswertung in eine InfluxDB gepackt, um sie mit Grafana untersuchen zu können.

    Weiterlesen...

Neueste Artikel

  • Die sQLshell ist nun cloudnative!

    Die sQLshell hat eine weitere Integration erfahren - obwohl ich eigentlich selber nicht viel dazu tun musste: Es existiert ein Projekt/Produkt namens steampipe, dessen Slogan ist select * from cloud; - Im Prinzip eine Wrapperschicht um diverse (laut Eigenwerbung mehr als 140) (cloud) data sources.

    Weiterlesen...
  • LinkCollections 2024 III

    Nach der letzten losen Zusammenstellung (für mich) interessanter Links aus den Tiefen des Internet von 2024 folgt hier gleich die nächste:

    Weiterlesen...
  • Funktionen mit mehreren Rückgabewerten in Java

    Da ich seit nunmehr einem Jahr bei meinem neeun Arbeitgeber beschäftigt und damit seit ungefähr derselben Zeit für Geld mit Python arbeite, haben sich gewisse Antipathien gegenüber Python vertieft (ich kann mit typlosen Sprachen einfach nicht umgehen) - aber auch einige meiner Gründe, Python zu lieben sind ebenso stärker geworden. Einer davon ist der Fakt, dass eine Methode in Python mehr als einen Wert zurückgeben kann.

    Weiterlesen...

Manche nennen es Blog, manche Web-Seite - ich schreibe hier hin und wieder über meine Erlebnisse, Rückschläge und Erleuchtungen bei meinen Hobbies.

Wer daran teilhaben und eventuell sogar davon profitieren möchte, muß damit leben, daß ich hin und wieder kleine Ausflüge in Bereiche mache, die nichts mit IT, Administration oder Softwareentwicklung zu tun haben.

Ich wünsche allen Lesern viel Spaß und hin und wieder einen kleinen AHA!-Effekt...

PS: Meine öffentlichen GitHub-Repositories findet man hier - meine öffentlichen GitLab-Repositories finden sich dagegen hier.