b9c6644312
Lazy implementation is now the default. Use `--eager` to force ffs to construct the entire filesystem on startup. NB that lazy loading is not the same as lazy parsing. There's still plenty of savings left on the table. There is some unwelcome code duplication in saving to accommodate type-level jiggery pokery. |
||
---|---|---|
.github/workflows | ||
bench | ||
binary | ||
completions | ||
docs | ||
json | ||
man | ||
src | ||
tests | ||
toml | ||
utils | ||
yaml | ||
.gitignore | ||
Cargo.lock | ||
Cargo.toml | ||
CHANGELOG.md | ||
INSTALL.md | ||
LICENSE | ||
README.md | ||
run_bench.sh | ||
run_tests.sh |
ffs: the file filesystem
ffs, the file filesystem, let's you mount semi-structured data as a filesystem---a tree structure you already know how to work with!
Working with semi-structured data using command-line tools is hard. Tools like jq help a lot, but learning a new language for simple manipulations is a big ask. By mapping hard-to-parse trees into a filesystem, you can keep using the tools you know.
Example
Run ffs [file.blah]
to mount file.blah
at the mountpoint file
. The
final, updated version of the file will be outputted on stdout.
$ cat object.json
{ "name": "Michael Greenberg", "eyes": 2, "fingernails": 10, "human": true }
$ ffs -o object_edited.json object.json &
[1] 60182
$ tree object
object
├── eyes
├── fingernails
├── human
└── name
0 directories, 4 files
$ echo Mikey Indiana >object/name
$ echo 1 >object/nose
$ mkdir object/pockets
$ cd object/pockets/
$ echo keys >pants
$ echo pen >shirt
$ cd ..
$ cd ..
$ umount object
$
[1]+ Done ffs -o object_edited.json object.json
$ cat object_edited.json
{"eyes":2,"fingernails":10,"human":true,"name":"Mikey Indiana","nose":1,"pockets":{"pants":"keys","shirt":"pen"}}
You can specify an explicit mountpoint by running ffs -m MOUNT file
;
you can specify an output file with -o OUTPUT
. You can edit a file
in place by running ffs -i file
---when the volume is unmounted, the
resulting output will be written back to file
.
External dependencies
You need an appropriate FUSE or macFUSE along with pkg-config.
See the GitHub build workflow for examples of external dependency installation.