ffs: ferramenta para montar dados semi-estruturados como JSON em um filesystem UNIX
ffs é a abreviação de File Filesystem, uma ferramenta que monta dados semi-estruturados como um sistema de arquivos para que você consiga manipular formatos modernos baseados em árvore, como JSON e YAML, usando ferramentas de shell conhecidas
- Editar JSON com processamento de strings, como com
sed, não é o melhor método, então é recomendável usar o ffs
- Atualmente o
ffs suporta JSON, YAML e TOML, e deve passar a suportar mais formatos no futuro
Exemplo de uso do ffs
- Com o comando
ffs [file], file.blah é montado no ponto de montagem chamado file, e a versão final modificada do arquivo é exibida no stdout
- Você pode especificar um ponto de montagem explícito com
ffs -m MOUNT file
- O arquivo de saída pode ser definido com
ffs -o OUTPUT
- Com
ffs -i file, você pode editar o arquivo diretamente; quando o volume é desmontado, o resultado é gravado novamente em file
- Ao editar, é possível ver que o valor da chave
nose passa a ser um número em vez de uma string, e o diretório pockets é convertido em objeto
Como instalar o ffs
- No Linux é necessário o
FUSE, e no macOS é necessário o macFUSE
- É possível baixar um único executável
- Também é possível compilar a partir do código-fonte
Saiba mais sobre o ffs
- Consulte o artigo da PLOS 2021 "Files-as-Filesystems for POSIX Shell Data Processing"
- Vídeos de demonstração e apresentação disponíveis
Comparação com ferramentas similares
- Ferramentas como
jq e gron são ótimas opções para manipular JSON via CLI
- O
ffs tem como vantagens o suporte a vários formatos, possibilidade de edição com ferramentas de shell familiares e a ausência de necessidade de aprender uma nova linguagem
- Entretanto, o
ffs pode não ser ideal para cenários sem suporte ao Windows, sem suporte ao FUSE, quando só é necessária busca, ou em arquivos muito grandes
Opinião do GN⁺
- Parece útil para manipular dados semi-estruturados amplamente utilizados em desenvolvimento web moderno, como JSON, YAML e TOML. Especialmente para fluxos de automação com shell script, parece bastante poderoso
- Entretanto, por ser baseado em
FUSE, pode haver questões de desempenho, e a falta de suporte ao Windows é uma desvantagem; não está claro se funcionará no WSL
- Como é open source, uma vantagem é que a comunidade pode contribuir para suportar mais formatos; para o usuário, isso tende a ajudar a melhorar produtividade e conveniência
- Para engenheiros familiarizados com ferramentas clássicas de processamento de texto como
sed e awk, é possível aplicar sem custo de aprendizado
- Deve ser útil para salvar respostas de API localmente para depuração ou quando houver necessidade de editar com frequência arquivos de configuração semi-estruturados
1 comentários
Comentários do Hacker News
Embalei o libfuse desenvolvido pelo próprio usuário em Nim para portar o exemplo de sistema de arquivos
helloe fiz uma versão que passa dados por pipeline e fornece um ponto de montagem. Ao terminar, ele grava o resultado nostdout. Assim dá para usar inline em uma cadeia de pipes, mas é preciso capturar a saída corretamente.Agora estou buscando outras coisas que podem ser transformadas em sistema de arquivos. Criei uma barra de status para o gerenciador de janelas Nimdow, que gera uma barra com blocos na saída ao gravar conteúdo em arquivos individuais. É super conveniente porque fica fácil de substituir o conteúdo exibido na barra de status.
Também fiz um player de música usando libvlc. Ele lê mídias com tags ID3 e monta pastas como
artista,álbumetc. Cada arquivo é nomeado como<número da faixa> - <título da música>e contém o caminho completo do arquivo real. Para tocar uma música, façacatde um desses arquivos emcontrol/currente escrevaplayemcontrol/command. Há recurso de playlist e mais comandos, mas essa é a ideia central. O objetivo é criar um player de música super scriptável.Sistemas Unix-like conseguem montar imagens de disco para navegar pelo conteúdo. Mas existem muitos outros formatos de arquivo úteis para navegar dentro de arquivos. Arquivos compactados são um exemplo. Alguns gerenciadores de arquivo já suportam isso, mas a camada de aplicação não é o melhor lugar para essa feature. Pode ser implementado com um driver por tipo de arquivo.
Estou procurando um sistema de arquivos FUSE que rode na memória enquanto montado (como um
tmpfs) e seja serializado para um único arquivo em disco ao desmontar. O driver FUSE mais parecido é montar arquivos de arquivo, mas não é possível obter coisas como links simbólicos.Também dá para montar commits do Git como sistema de arquivos. (link de referência)
Também existe o Parts-of-file File System. (link de referência do Usenix)
Lembra o TabFS do Omar Rizwan. (link de referência)
Eu já fiz algo assim em 2003. Foi surpreendente por ser rápido e por permitir bloqueios de granularidade fina com facilidade. Usei como banco de dados por usuário para uma linguagem de template de uma ferramenta de construção de site gigante.
Pergunta sobre o que acontece quando uma chave JSON contém uma barra.
Isso abre a possibilidade de fazer commit de arquivos como estrutura de diretórios. Fiquei curioso sobre como isso afetaria merge e conflitos.
Parece muito legal e acho que é bom tentar assim que possível. Parece útil para buscar e navegar dentro de arquivos JSON.