- ffs (file filesystem) est un outil qui monte des données semi-structurées comme JSON, YAML ou TOML sous forme de système de fichiers, afin de les parcourir et les modifier avec les outils du shell Unix
- Le shell Unix dispose de nombreux outils de traitement de chaînes, mais comme sa structure de données de base est le système de fichiers, il n’est pas vraiment adapté à la modification de données arborescentes
ffs [file]associe un fichier à un point de montage et, lors du démontage, exporte le résultat mis à jour vers stdout ou vers un fichier de sortie spécifié- L’écriture de fichiers et la création de répertoires sont converties en clés et objets JSON ;
1,true,falseet un fichier vide sont respectivement reflétés comme nombre, booléens et valeur null - Sous Linux, FUSE est nécessaire ; sous macOS, macFUSE est requis. L’outil peut ne pas convenir à Windows, aux environnements où FUSE n’est pas disponible, aux tâches limitées à la recherche ou aux très gros fichiers
Traiter des données semi-structurées comme des répertoires
- ffs, abréviation de file filesystem, permet de monter des données semi-structurées comme un système de fichiers pour travailler dessus avec des outils shell familiers
- Les formats actuellement pris en charge sont JSON, YAML, TOML ; la prise en charge d’autres formats est prévue
- La documentation détaillée est disponible dans la
manpagedeffs
Flux de montage et de modification
- L’exécution par défaut est
ffs [file]: elle montefile.blahsur le point de montagefileet écrit la version finale mise à jour sur stdout ffs -m MOUNT filepermet de spécifier explicitement un point de montage, et-o OUTPUTde définir un fichier de sortieffs -i filemodifie le fichier sur place ; lorsque le volume est démonté, le résultat est réécrit dansfile-
Règles de conversion visibles dans l’exemple
echo Mikey Indiana >object/namemodifie la valeur JSONnameecho 1 >object/noseest reflété comme le nombre1, et non comme une chaînemkdir object/pocketset les fichiers qu’il contient sont convertis en objet JSON- Le fichier vide
mistakesest enregistré commenulldans JSON
Conditions d’installation et distribution
- Sous Linux, FUSE est nécessaire
- Sous macOS, macFUSE est nécessaire
- Les derniers builds de développement sont fournis sous forme d’exécutables uniques pour Linux et macOS
- Les versions spécifiques sont disponibles sur la page des releases, et la version actuelle est 0.1.2
- Il est aussi possible de le compiler depuis la source
Ressources liées et points de comparaison
- Il existe l’article PLOS 2021 « Files-as-Filesystems for POSIX Shell Data Processing »
- jq et gron sont des outils pour manipuler JSON en ligne de commande
- ffs se distingue par sa prise en charge de plusieurs formats, la possibilité de modifier les données avec des outils shell familiers et l’absence de nouveau langage à apprendre
- L’utilisation sous Windows, l’impossibilité d’utiliser FUSE, les tâches qui ne nécessitent que de la recherche et les très gros fichiers peuvent ne pas être adaptés à ffs
- La licence est GPLv3
1 commentaires
Avis sur Hacker News
C’est génial. Récemment, après avoir écrit un wrapper Nim pour libfuse, j’ai porté l’exemple de système de fichiers
hello, et j’ai fait quasiment la même choseMa version prend les données via un pipe et nécessite d’indiquer un point de montage ; une fois terminé, elle écrit le résultat sur la sortie standard. On peut donc l’insérer dans une chaîne de pipes, mais il faut aussi gérer la sortie soi-même
En ce moment, j’explore si d’autres choses peuvent être transformées en systèmes de fichiers. J’ai aussi créé une barre d’état pour le gestionnaire de fenêtres Nimdow : en écrivant du contenu dans des fichiers individuels, on obtient en sortie une barre avec des blocs, ce qui permet de remplacer facilement le contenu de la barre
Un autre outil que j’ai créé est un lecteur de musique basé sur libvlc. On lui donne un dossier, il lit les médias avec des tags ID3 et construit des dossiers comme
by-artist,by-album. Chaque fichier s’appelle-et contient le chemin complet du fichier réel. Pour lire un morceau, on peut par exemple faire uncatd’un fichier verscontrol/currentet écrireplaydanscontrol/command. Il y a d’autres fonctions de playlist et d’autres commandes, mais l’objectif est de faire un lecteur de musique très facile à scripterSi l’on veut comprendre la structure d’une base de code, il suffit de lancer
tree:)En allant plus loin, on pourrait peut-être résoudre les imports sous forme de liens symboliques, entre autres ; il y a beaucoup de possibilités intéressantes
Par exemple, faire
cat /proc/$pid/fs/current_trackpour obtenir le nom du morceau en cours dans un lecteur de musique, ouls /proc/$pid/fs/tabspour voir la liste des onglets ouverts dans un navigateur. On pourrait peut-être même récupérer du HTML ou des images intégréesC’est déjà possible avec FUSE, mais c’est assez pénible pour que personne ne le fasse
C’est suffisamment utile pour devoir devenir une fonction standard au niveau du système d’exploitation
Les systèmes de type Unix peuvent monter des images disque pour en parcourir le contenu. Mais lorsqu’on explore des fichiers à l’intérieur de fichiers, il y a bien plus de formats utiles. Les archives compressées en sont l’exemple typique
Certains gestionnaires de fichiers prennent cela en charge, mais je ne pense pas que la couche applicative soit le meilleur endroit pour le faire. On pourrait l’implémenter comme des pilotes par format de fichier
file, et tout devrait pouvoir se faire en espace utilisateurLe seul facteur qui bloque aujourd’hui, c’est que MacOS n’expose pas d’API de système de fichiers en espace utilisateur. Sous Linux, Windows et BSD, c’est déjà possible
Si un développeur Apple lit ceci : les extensions de fournisseur de fichiers ne suffisent pas. Donnez-nous l’équivalent de FUSE. Je sais que ça existe
https://avf.sourceforge.net/
En tout cas, même si ce n’est pas exactement ce que tu veux, FUSE est un mécanisme plus général qui semble permettre de faire ce que tu souhaites, et même davantage
On peut aussi monter des commits git comme un système de fichiers
https://jvns.ca/blog/2023/12/04/mounting-git-commits-as-fold...
Article précédent : https://news.ycombinator.com/item?id=38527866
En voyant le titre, j’ai espéré que c’était quelque chose que je cherchais autrefois, ou que j’avais envisagé de créer moi-même. C’est peut-être le bon endroit pour poser la question
Existe-t-il un système de fichiers FUSE qui, tant qu’il est monté, fonctionne en mémoire comme tmpfs, puis se sérialise dans un fichier unique sur disque au moment du démontage ?
Ce qui s’en rapproche le plus, ce sont les pilotes FUSE qui montent des fichiers d’archive, mais il devient alors difficile d’obtenir des choses comme les liens symboliques
libsqlfs implémente un système de fichiers de style POSIX au-dessus d’une base SQLite. Il fournit un système de fichiers en lecture/écriture, avec sa propre hiérarchie et son propre espace de noms à l’intérieur d’un fichier unique, et peut être utilisé comme bibliothèque partagée ou module FUSE
C’est rudimentaire comparé aux DMG d’OSX, mais avec un peu d’indulgence, cela atteint un objectif similaire
Sinon, on pourrait envelopper tmpfs pour le sérialiser, au démontage, en tarball préservant les liens symboliques
Tu le sais sans doute déjà, mais il existe de nombreux scénarios réalistes où ne flusher les buffers qu’au démontage peut entraîner une corruption des données
Cela dit, le problème que tu essaies de résoudre semble intéressant
/tmp, l’utiliser, puis la déplacer vers le disque après démontage devrait s’en rapprocher pas malIl existe aussi Parts-of-file File System : https://www.usenix.org/conference/2005-usenix-annual-technic...
Ça me fait penser à TabFS d’Omar Rizwan : <https://omar.website/tabfs/>
J’ai fait ça en 2003. Étonnamment, c’était rapide, et cela rendait le verrouillage fin facile
Je l’utilisais comme base de données par utilisateur dans un langage de templates web pour un énorme outil de création de sites
En voyant le titre, j’ai cru que c’était un mème
Mais c’est en fait une idée vraiment maligne. Personnellement, comme je fais la plupart de mes traitements de données dans des langages de plus haut niveau, je ne sais pas trop si je l’utiliserais directement, mais je pense que certains trouveront des cas d’usage
C’est une bonne approche qui sort des sentiers battus
Ça a l’air vraiment bien, et je dois essayer ça dès que possible
Je pense que ce serait très pratique pour parcourir ou rechercher dans des fichiers JSON
Si cela vous intéresse, Solvent-Configr pourrait aussi vous parler
https://aws.amazon.com/marketplace/pp/prodview-i3ym46leenag4
En modélisant des objets via un mécanisme de système de fichiers, on peut concevoir des solutions orientées objet qui prennent en charge une navigation à la manière d’un système de fichiers
Démo : https://youtu.be/XgTgubZQPHw