ffs: herramienta para montar datos semiestructurados como JSON en un sistema de archivos UNIX
- ffs es el acrónimo de File Filesystem y permite montar datos semiestructurados como un sistema de archivos para manejarlos con herramientas de shell conocidas, incluyendo formatos modernos con estructura en árbol como JSON y YAML.
- No es una buena idea editar JSON usando procesamiento de texto con sed, por lo que conviene usar ffs.
- Actualmente, ffs admite JSON, YAML y TOML, y se espera que soporte más formatos.
Cómo usar ffs
- Con el comando
ffs [file], monta file.blah en un punto de montaje llamado file, y la versión final del archivo modificado se imprime en stdout.
- Puedes especificar un punto de montaje explícito con
ffs -m MOUNT.
- Puedes indicar el archivo de salida con
ffs -o OUTPUT.
- Con
ffs -i file puedes editar el archivo directamente, y al desmontar el volumen el resultado se vuelve a escribir en file.
- Al editar, se puede ver que el valor de la clave
nose se vuelve numérico en lugar de cadena y que el directorio pockets se convierte en un objeto.
Cómo instalar ffs
- En Linux se requiere FUSE y, en macOS, macFUSE.
- Puedes descargar un archivo ejecutable único.
- También es posible compilar desde el código fuente.
Más sobre ffs
- Consulta el artículo "Files-as-Filesystems for POSIX Shell Data Processing" en PLOS 2021.
- Incluye videos de demostración y de presentación.
Comparativa con herramientas relacionadas
- jq, gron y herramientas similares son buenas opciones de CLI para manipular JSON.
- ffs tiene ventajas como soporte para múltiples formatos, edición con herramientas de shell familiares y no requiere aprender un lenguaje nuevo.
- Sin embargo, puede que ffs no sea la mejor opción si no tienes soporte para Windows, no puedes usar FUSE, solo necesitas búsquedas o el archivo es muy grande.
Opinión de GN⁺
- Parece útil para manejar datos semiestructurados como JSON, YAML y TOML, muy utilizados en el desarrollo web moderno. Especialmente parece muy potente al automatizar tareas con scripts de shell.
- Sin embargo, como está basado en FUSE puede haber cuestiones de rendimiento, y la falta de soporte para Windows es una desventaja. No se sabe si funcionará en WSL.
- Como es open source, la ventaja es que puedes contribuir para soportar más formatos. Desde el punto de vista del usuario, parece útil para mejorar la comodidad y la productividad.
- Si eres un ingeniero familiarizado con herramientas clásicas de procesamiento de texto como
sed o awk, puedes adoptarlo sin costo de aprendizaje.
- Puede ser útil para guardar respuestas de API localmente para depuración o cuando necesitas editar frecuentemente archivos de configuración semiestructurados.
1 comentarios
Comentarios de Hacker News
Envuelve
libfuse, que él mismo escribió, en Nim y portó el ejemplo de sistema de archivoshello, haciendo una versión que envía datos por unpipey proporciona un punto de montaje. Al terminar, escribe el resultado enstdout. Así se puede usar en línea dentro de una cadena depipes, pero hay que capturar bien la salida.Está explorando qué más se puede convertir en un sistema de archivos. Hizo una barra de estado para el gestor de ventanas Nimdow; al escribir contenido en archivos individuales, genera como salida una barra con bloques. Es muy cómodo porque se puede reemplazar fácilmente el contenido de la barra de estado.
También hizo un reproductor de música con
libvlc. Lee medios con etiquetas ID3 y configura carpetas como "por artista", "por álbum", etc. Cada archivo se nombra como<Número de pista> - <Título de la canción>y contiene la ruta completa del archivo real. Para reproducir una canción, hacecatcon uno de esos archivos encontrol/currenty escribe la palabraplayencontrol/command. También hay función de lista de reproducción y más comandos, pero esa es la idea central. El objetivo es crear un reproductor de música súper poderoso y muy scriptable.Los sistemas Unix pueden montar imágenes de disco y explorar su contenido. Sin embargo, hay muchos otros formatos de archivo útiles para navegar dentro de archivos. Los archivos comprimidos son uno de ellos. Algunos administradores de archivos lo soportan, pero la capa de la aplicación no es el nivel ideal para incorporar esta función. Puede implementarse con controladores por tipo de archivo.
Se está buscando un sistema de archivos FUSE que se ejecute en memoria mientras está montado (como
tmpfs) y se serialice en un único archivo en disco al desmontarlo. El controlador FUSE para montar archivos de archivo comprimido es el más parecido, pero no se pueden obtener cosas como enlaces simbólicos.También puedes montar commits de Git como un sistema de archivos. (enlace de referencia)
También existe el Parts-of-file File System. (enlace de referencia de Usenix)
Me recordó a TabFS de Omar Rizwan. (enlace de referencia)
Lo intenté en 2003. Sorprendentemente, lo hice rápido y era fácil hacer bloqueos granulares. Lo usé como una base de datos por usuario para un lenguaje de plantillas web de una herramienta enorme para construir sitios web.
Una pregunta sobre qué pasa si una clave JSON tiene una barra.
Esto abre la posibilidad de hacer commit de archivos como una estructura de directorios. Me pregunto qué impacto tendrá esto en merge y en los conflictos.
Se ve increíble, y sería bueno probarlo tan pronto como sea posible. Parece muy útil para buscar y explorar dentro de archivos JSON.