ffs: UNIX-Dateisystem, mit dem halbstrukturierte Daten wie JSON als Dateisystem eingebunden werden
ffs steht für File Filesystem und ist ein Tool, das halbstrukturierte Daten als Dateisystem einbindet, sodass man moderne, baumartige Formate wie JSON oder YAML mit vertrauten Shell-Werkzeugen bearbeiten kann.
- Das Bearbeiten von JSON mit stringorientierten Tools wie
sed ist keine besonders gute Methode, daher ist ffs oft die bessere Wahl.
- Aktuell unterstützt ffs JSON, YAML und TOML; weitere Formate sind geplant.
Verwendung von ffs
- Mit dem Befehl
ffs [file] wird file.blah im Mountpoint file eingebunden, und die modifizierte Endversion der Datei wird auf stdout ausgegeben.
- Mit
ffs -m MOUNT file kann ein expliziter Mountpoint angegeben werden.
- Mit
ffs -o OUTPUT kann die Ausgabedatei angegeben werden.
- Mit
ffs -i file kann die Datei direkt bearbeitet werden; beim Aushängen des Volumes werden die Ergebnisse wieder in file geschrieben.
- Bei der Bearbeitung lässt sich beobachten, dass der Wert des Schlüssels
nose zu einer Zahl statt zu einem String wird und das Verzeichnis pockets in ein Objekt umgewandelt wird.
Installation von ffs
- Unter Linux ist FUSE und unter macOS macFUSE erforderlich.
- Eine einzelne ausführbare Datei kann heruntergeladen werden.
- Ein Build aus dem Source ist ebenfalls möglich.
Mehr über ffs
- Siehe den PLOS-2021-Paper „Files-as-Filesystems for POSIX Shell Data Processing“.
- Demo-Video und Vortragsvideo sind verfügbar.
Vergleich mit ähnlichen Tools
jq, gron usw. sind gute Tools zur Verarbeitung von JSON auf der CLI.
- ffs hat Vorteile wie die Unterstützung verschiedener Formate, die Bearbeitung mit vertrauten Shell-Werkzeugen und keine neue Sprache erlernen zu müssen.
- Ffs ist jedoch möglicherweise nicht ideal, wenn Windows nicht unterstützt wird, FUSE nicht zur Verfügung steht, nur die Suche benötigt wird oder es sich um sehr große Dateien handelt.
GN⁺-Meinung
- Für den Umgang mit halbstrukturierten Daten wie JSON, YAML und TOML, die in der modernen Webentwicklung häufig genutzt werden, wirkt es sehr nützlich. Besonders bei Automatisierungsaufgaben mit Shell-Skripten scheint es stark zu sein.
- Als FUSE-basiertes Werkzeug kann es jedoch zu Performance-Problemen kommen, und der fehlende Support für Windows ist bedauerlich. Ob es in WSL nutzbar ist, ist unklar.
- Als Open-Source-Projekt ist es ein Pluspunkt, dass Beiträge zur Unterstützung weiterer Formate möglich sind. Aus Nutzersicht dürfte es Komfort und Produktivität steigern.
- Wer mit klassischen Textverarbeitungswerkzeugen wie
sed oder awk vertraut ist, kann es ohne zusätzliche Lernkosten sofort einsetzen.
- Wenn man API-Antworten lokal speichert, um zu debuggen, oder häufig halbstrukturierte Konfigurationsdateien anpassen muss, dürfte es nützlich sein.
1 Kommentare
Hacker News Kommentar
Ein Nutzer hat libfuse, das er selbst entwickelt hat, in Nim verpackt und eine portierte Version des
'hello'-Dateisystem-Beispiels erstellt, die Daten per Pipe überträgt und einen Mountpoint bereitstellt. Nach dem Abschluss schreibt sie das Ergebnis über stdout. So kann es in eine Pipe-Kette eingebettet werden, aber man muss die Ausgabe sicher abgreifen.Er erkundet derzeit, was man sonst noch als Dateisystem bauen kann. Für den Nimdow-Window-Manager hat er eine Statusleiste gebaut, die beim Schreiben in einzelne Dateien eine Leiste aus Blöcken als Ausgabe erzeugt. Den Inhalt der Statusleiste kann man sehr einfach austauschen, was ziemlich praktisch ist.
Er hat auch einen Musikplayer mit libvlc gebaut. Er liest Medien mit ID3-Tags und erstellt Ordner wie „nach Künstlern“ und „nach Alben“. Jede Datei ist als
'<Spurnummer> - <Songtitel>'benannt und enthält den vollständigen Pfad der eigentlichen Datei. Um einen Song abzuspielen, schreibt man eine dieser Dateien incontrol/current(mitcat) und trägt incontrol/commanddas Wortplayein. Es gibt zwar Playlist-Funktionalität und weitere Befehle, aber das ist die Grundidee. Ziel ist es, einen extrem skriptbaren Musikplayer zu bauen.Unix-ähnliche Betriebssysteme können Festplatten-Images mounten und deren Inhalt durchsuchen. Es gibt aber mehr Dateiformate, bei denen die Navigation innerhalb von Dateien sinnvoll ist. Komprimierte Archive sind ein Beispiel. Einige Dateimanager unterstützen das, aber die Anwendungsebene ist dafür keine optimale Schicht. Es könnte als Treiber pro Dateityp umgesetzt werden.
Ich suche gerade nach einem FUSE-Dateisystem, das während des Mountens nur im Speicher läuft (wie tmpfs) und beim Unmount in eine einzelne Datei auf der Festplatte serialisiert wird. Ein FUSE-Treiber, der Archivdateien mounted, ist am ähnlichsten, aber symbolische Links o. Ä. sind damit nicht möglich.
Git-Commits können ebenfalls als Dateisystem gemountet werden. (Link-Referenz)
Es gibt auch das Parts-of-file File System. (Usenix-Referenz)
Erinnerungen an TabFS von Omar Rizwan. (Link-Referenz)
So etwas habe ich 2003 schon mal gemacht. Überraschend schnell, und man kann damit leicht feingranulare Locks erzeugen. Es wurde als benutzerspezifische Datenbank für eine Web-Template-Sprache eines riesigen Website-Building-Tools genutzt.
Es wurde gefragt, was passiert, wenn ein Slash in einem JSON-Key steckt.
Dadurch entsteht die Möglichkeit, Dateien als Verzeichnisstruktur zu committen. Wie sich das auf Merges und Konflikte auswirkt, ist dabei fraglich.
Sieht cool aus und sollte so schnell wie möglich ausprobiert werden. Es scheint nützlich zu sein, um in JSON-Dateien zu suchen und sie zu navigieren.