ffs : un outil qui monte des données semi-structurées comme JSON sur un système de fichiers UNIX
- ffs est l’abréviation de File Filesystem ; il monte des données semi-structurées en tant que système de fichiers pour manipuler, avec des outils shell familiers, des formats arborescents modernes comme JSON et YAML.
- L’édition de JSON au moyen d’outils de traitement de chaînes comme
sed n’est pas une bonne approche, il vaut donc mieux utiliser ffs.
ffs prend actuellement en charge JSON, YAML et TOML, et prendra en charge davantage de formats à l’avenir.
Exemples d’utilisation de ffs
- La commande
ffs [file] monte file.blah sur le point de montage file, et la version finale modifiée du fichier est affichée sur stdout.
- Vous pouvez spécifier explicitement un point de montage avec
ffs -m MOUNT file.
- Vous pouvez définir un fichier de sortie avec
ffs -o OUTPUT.
- Avec
ffs -i file, vous pouvez éditer directement le fichier ; au démontage du volume, le résultat est réécrit dans file.
- Lors de l’édition, vous pouvez constater que la valeur de la clé
nose devient un nombre au lieu d’une chaîne et que le répertoire pockets est converti en objet.
Installation de ffs
- FUSE est requis sur Linux, et macFUSE sur macOS.
- Un seul exécutable peut être téléchargé.
- La compilation depuis les sources est également possible.
Pour en savoir plus sur ffs
- Référence : PLOS 2021, « Files-as-Filesystems for POSIX Shell Data Processing ».
- Des vidéos de démonstration et de présentation sont disponibles.
Comparaison avec des outils similaires
jq, gron, etc., sont d’excellents outils CLI pour manipuler du JSON.
ffs a l’avantage de supporter de nombreux formats, de permettre l’édition avec des outils shell familiers et de ne pas exiger l’apprentissage d’un nouveau langage.
- Toutefois,
ffs peut ne pas convenir dans certains cas : absence de support Windows, impossibilité d’utiliser FUSE, besoin uniquement de recherche, fichiers extrêmement volumineux, etc.
Opinion de GN⁺
ffs semble utile pour traiter des données semi-structurées couramment utilisées en développement web moderne, comme JSON, YAML et TOML. Il parait particulièrement puissant pour l’automatisation via des scripts shell.
- En revanche, comme il repose sur FUSE, des problèmes de performance peuvent survenir, et l’absence de support Windows est regrettable. On ignore s’il fonctionne sous WSL.
- Le fait d’être open source est un avantage : il est possible de contribuer pour ajouter la prise en charge de nouveaux formats. Pour les utilisateurs, cela semble utile pour gagner en commodité et en productivité.
- Les ingénieurs habitués aux outils de traitement de texte classiques comme
sed ou awk peuvent l’adopter directement, sans coût d’apprentissage.
- Cela peut être utile pour enregistrer les réponses d’API en local pour le débogage, ou lorsqu’il faut modifier fréquemment des fichiers de configuration semi-structurés.
1 commentaires
Commentaires Hacker News
J’ai empaqueté une implémentation de libfuse développée par l’utilisateur en Nim, j’ai porté l’exemple de système de fichiers 'hello' et créé une version qui transmet les données via un pipe et fournit un point de montage. Une fois terminé, il écrit le résultat via
stdout. Cela permet de l’utiliser directement dans une chaîne de pipes, mais il faut absolument récupérer la sortie.Je cherche en ce moment d’autres choses qu’on peut faire avec un système de fichiers. J’ai créé une barre d’état pour le gestionnaire de fenêtres Nimdow : écrire du contenu dans un fichier individuel produit une barre avec des blocs en sortie. C’est très pratique parce qu’il suffit de changer facilement le contenu de la barre d’état.
J’ai aussi créé un lecteur de musique utilisant libvlc. Il lit les médias avec des tags ID3 et crée des dossiers comme 'par artiste', 'par album'. Chaque fichier est nommé '<numéro de piste> - <titre du morceau>' et contient le chemin complet du fichier réel. Pour lire un morceau, il faut
catun de ces fichiers dans 'control/current' et écrire le mot play dans 'control/command'. Il y a aussi une fonction de playlist et davantage de commandes, mais voici l’idée de base. L’objectif est de faire un lecteur de musique hautement scriptable.Les systèmes d’exploitation de type Unix peuvent monter des images disque pour en parcourir le contenu. Cependant, il existe davantage de formats de fichiers utiles pour explorer le contenu interne d’un fichier. Les archives compressées en font partie. Certains gestionnaires de fichiers le supportent déjà, mais la couche applicative n’est pas idéale pour intégrer cette fonctionnalité. On peut l’implémenter avec des pilotes par type de fichier.
Je cherche un système de fichiers FUSE qui s’exécute en mémoire pendant le montage (un peu comme tmpfs), puis se sérialise dans un seul fichier sur disque lors du démontage. Le pilote FUSE qui monte les archives est le plus proche de ça, mais on ne peut pas obtenir des choses comme les liens symboliques.
On peut également monter un commit Git comme système de fichiers. (référence au lien)
Il existe aussi le 'Parts-of-file File System'. (référence au lien Usenix)
Ça me rappelle le TabFS d’Omar Rizwan. (référence au lien)
J’ai déjà fait quelque chose comme ça en 2003. Étonnamment, c’était rapide et les verrous étaient faciles à rendre fins. J’ai utilisé ça comme base de données par utilisateur pour un langage de templates web pour un outil de construction de sites web massifs.
Question : que se passe-t-il quand une clé JSON contient un slash ?
Cela ouvre la possibilité d’embarquer des fichiers dans une structure de répertoires. Je me demande quel impact cela aurait sur les merges et les conflits.
Ça a l’air vraiment cool ; je dois absolument essayer au plus vite. Ça devrait être utile pour rechercher et parcourir l’intérieur des fichiers JSON.