Presentan el sistema de archivos «File Filesystem» (2021)
(mgree.github.io)- ffs (file filesystem) es una herramienta que monta datos semiestructurados como JSON, YAML y TOML como un sistema de archivos para explorarlos y editarlos con herramientas del shell de Unix
- El shell de Unix tiene muchas herramientas para procesar cadenas, pero como su estructura de datos básica es el sistema de archivos, no se adapta tan bien a la edición de datos en forma de árbol
ffs [file]conecta un archivo a un punto de montaje y, al desmontarlo, envía el resultado actualizado a stdout o al archivo de salida especificado- La escritura de archivos y la creación de directorios se convierten en claves y objetos JSON, y
1,true,falsey un archivo vacío se reflejan respectivamente como valores numéricos, booleanos y null - En Linux se necesita FUSE, en macOS macFUSE, y puede no ser adecuado para Windows, entornos donde no se puede usar FUSE, tareas solo de búsqueda o archivos muy grandes
Tratar datos semiestructurados como si fueran directorios
- ffs significa file filesystem y permite montar datos semiestructurados como si fueran un sistema de archivos para trabajar con herramientas del shell conocidas
- Los formatos compatibles actualmente son JSON, YAML, TOML, y está previsto añadir más formatos
- El uso detallado puede consultarse en la
manpagedeffs
Flujo de montaje y edición
- La ejecución básica es
ffs [file], que montafile.blahen el punto de montajefiley muestra la versión final actualizada en stdout - Con
ffs -m MOUNT filese puede indicar explícitamente el punto de montaje, y con-o OUTPUTse puede especificar el archivo de salida ffs -i fileedita el archivo en su lugar, y al desmontar el volumen el resultado vuelve a escribirse enfile-
Reglas de conversión que se ven en el ejemplo
echo Mikey Indiana >object/namecambia el valornameen JSONecho 1 >object/nosese refleja como el número1, no como una cadenamkdir object/pocketsy los archivos dentro de ese directorio se convierten en un objeto JSON- El archivo vacío
mistakesse registra comonullen JSON
Requisitos de instalación y distribución
- En Linux se necesita FUSE
- En macOS se necesita macFUSE
- Las compilaciones de desarrollo más recientes se ofrecen como ejecutables únicos para Linux y macOS
- Las versiones específicas pueden consultarse en la página de lanzamientos, y la versión actual es la 0.1.2
- También se puede compilar desde el código fuente
Material relacionado y puntos de comparación
- Existe el artículo de PLOS 2021 “Files-as-Filesystems for POSIX Shell Data Processing”
- jq y gron son herramientas para manejar JSON desde la línea de comandos
- ffs se diferencia por admitir varios formatos, permitir la edición con herramientas de shell conocidas y no requerir aprender un lenguaje nuevo
- Puede no ser adecuado para usar en Windows, cuando no se puede usar FUSE, en tareas donde solo se necesita buscar o con archivos muy grandes
- La licencia es GPLv3
1 comentarios
Opiniones en Hacker News
Esto está genial. Hace poco envolví libfuse con Nim y porté el ejemplo de sistema de archivos
hello; terminé haciendo casi lo mismo.Mi versión requiere pasar los datos por una tubería y especificar el punto de montaje, y al terminar escribe el resultado en la salida estándar. Así que se puede insertar en una cadena de pipes, pero también hay que encargarse de la salida.
Ahora estoy explorando si se pueden convertir otras cosas en sistemas de archivos. También hice una barra de estado para el gestor de ventanas Nimdow: si escribes contenido en archivos individuales, se genera como salida una barra con bloques, lo que facilita reemplazar el contenido de la barra.
Otra herramienta que hice es un reproductor de música basado en libvlc. Le pasas una carpeta, lee medios con etiquetas ID3 y arma carpetas como
by-artistyby-album. Cada archivo se llama-y contiene la ruta completa del archivo real. Para reproducir una canción, por ejemplo, hacescatde un archivo acontrol/currenty escribesplayencontrol/command. Tiene más funciones y comandos de lista de reproducción, pero el objetivo es crear un reproductor de música muy fácil de automatizar con scripts.Si quieres entender la estructura de una base de código, simplemente ejecutas
tree:)Si se profundiza más, quizá los imports podrían resolverse como enlaces simbólicos, entre otras posibilidades interesantes.
Por ejemplo, hacer
cat /proc/$pid/fs/current_trackpara obtener el nombre de la canción actual de un reproductor de música, ols /proc/$pid/fs/tabspara ver la lista de pestañas abiertas de un navegador. Tal vez incluso se podrían obtener el HTML o las imágenes incrustadas.Hoy ya se puede hacer con FUSE, pero es tan engorroso que nadie lo hace.
Creo que es lo bastante útil como para convertirse en una función estándar a nivel de sistema operativo.
Los sistemas operativos tipo Unix pueden montar imágenes de disco para explorar su contenido. Pero si se exploran archivos dentro de archivos, hay muchísimos más formatos útiles. Los archivos comprimidos son el ejemplo típico.
Algunos gestores de archivos lo soportan, pero no creo que ponerlo en la capa de aplicación sea el lugar óptimo. Parece algo que podría implementarse como controladores por formato de archivo.
file, y todo debería poder hacerse en espacio de usuario.El único factor que hoy lo impide es que MacOS no expone una API de sistemas de archivos en espacio de usuario. En Linux, Windows y BSD ya es posible.
Si algún desarrollador de Apple está leyendo esto: las extensiones de proveedor de archivos no alcanzan. Denos algo equivalente a FUSE. Sé que existe.
https://avf.sourceforge.net/
En cualquier caso, aunque eso no sea exactamente lo que se busca, FUSE es un mecanismo más general y parece que permitiría hacer lo que quieres, e incluso más.
También se pueden montar commits de git como un sistema de archivos.
https://jvns.ca/blog/2023/12/04/mounting-git-commits-as-fold...
Publicación anterior: https://news.ycombinator.com/item?id=38527866
Al ver el título me emocioné porque pensé que era algo que había estado buscando antes, o que pensaba hacer yo mismo. Quizá sea buen lugar para preguntar.
¿Existe un sistema de archivos FUSE que, mientras está montado, funcione en memoria como tmpfs, y al desmontarlo se serialice en un único archivo en disco?
Lo más cercano son los controladores FUSE que montan archivos de archivo comprimido, pero así es difícil obtener cosas como enlaces simbólicos.
libsqlfs implementa un sistema de archivos estilo POSIX sobre una base de datos SQLite. Ofrece un sistema de archivos de lectura/escritura con su propia jerarquía y espacio de nombres dentro de un solo archivo, y puede usarse como biblioteca compartida o como módulo FUSE.
Comparado con los DMG de OSX es tosco, pero si se lo mira con generosidad logra un propósito parecido.
O también se podría envolver tmpfs para que, al desmontarlo, se serialice en un tarball que preserve enlaces simbólicos.
Como probablemente ya sabes, hay muchos escenarios realistas en los que vaciar los búferes solo al desmontar puede llevar a corrupción de datos.
Aun así, el problema que intentas resolver parece interesante.
/tmp, usándolo, y luego, tras desmontarlo, moviéndolo al disco.También existe Parts-of-file File System: https://www.usenix.org/conference/2005-usenix-annual-technic...
Me recuerda a TabFS de Omar Rizwan: <https://omar.website/tabfs/>
Hice esto en 2003. Sorprendentemente era rápido, y facilitaba hacer bloqueos granulares.
Lo usé como base de datos por usuario en un lenguaje de plantillas web para una herramienta enorme de creación de sitios web.
Al ver el título pensé que era un meme.
Pero en realidad es una idea muy ingeniosa. En lo personal, proceso la mayoría de los datos en lenguajes de más alto nivel, así que no sé si lo usaría directamente, pero seguro habrá gente que le encuentre casos de uso.
Es un buen enfoque fuera de lo convencional.
Se ve muy bien, y tengo que probarlo cuanto antes.
Creo que podría servir muy bien para explorar o buscar dentro de archivos JSON.
Si esto te parece interesante, quizá también te interese Solvent-Configr.
https://aws.amazon.com/marketplace/pp/prodview-i3ym46leenag4
Permite modelar objetos mediante un mecanismo de sistema de archivos, para diseñar soluciones basadas en objetos que admiten exploración al estilo de un sistema de archivos.
Demo: https://youtu.be/XgTgubZQPHw