ffs: Công cụ mount dữ liệu bán cấu trúc như JSON lên hệ thống tập tin UNIX
ffs là viết tắt của File Filesystem, cho phép gắn dữ liệu bán cấu trúc dưới dạng hệ thống tập tin để thao tác các định dạng hiện đại có cấu trúc dạng cây như JSON, YAML bằng các công cụ shell quen thuộc
- Việc chỉnh sửa JSON bằng cách xử lý chuỗi kiểu
sed không phải là cách tốt, nên nên dùng ffs
- Hiện tại ffs hỗ trợ JSON, YAML, TOML và sẽ hỗ trợ thêm nhiều định dạng hơn trong tương lai
Ví dụ sử dụng ffs
- Lệnh
ffs [file] sẽ mount file.blah vào điểm mount file, và phiên bản tệp đã chỉnh sửa cuối cùng sẽ được in ra stdout
- Có thể chỉ định mount point rõ ràng bằng
ffs -m MOUNT file
- Có thể chỉ định file đầu ra bằng
ffs -o OUTPUT
- Có thể chỉnh sửa file trực tiếp bằng
ffs -i file, và khi unmount volume thì kết quả sẽ được ghi lại vào file
- Khi chỉnh sửa, có thể thấy giá trị khóa
nose trở thành số thay vì chuỗi, và thư mục pockets được chuyển thành đối tượng
Cách cài đặt ffs
- Trên Linux cần có FUSE, trên macOS cần có macFUSE
- Có thể tải về một file thực thi duy nhất
- Có thể build từ source
Tìm hiểu thêm về ffs
- Tham khảo bài báo "Files-as-Filesystems for POSIX Shell Data Processing" trên PLOS 2021
- Cung cấp video demo và video thuyết trình
So sánh với các công cụ liên quan
- jq, gron... là các công cụ CLI tốt để làm việc với JSON
- ffs có ưu điểm là hỗ trợ nhiều định dạng, chỉnh sửa được bằng công cụ shell quen thuộc và không cần học ngôn ngữ mới
- Tuy nhiên, ffs có thể không phù hợp trong các trường hợp không hỗ trợ Windows, không dùng được FUSE, chỉ cần tìm kiếm, hoặc với file rất lớn
Ý kiến GN⁺
- Có vẻ hữu ích cho việc xử lý dữ liệu bán cấu trúc như JSON, YAML, TOML, vốn được dùng nhiều trong phát triển web hiện đại. Đặc biệt, khi tự động hóa bằng shell script thì rất hữu ích
- Tuy nhiên, vì dựa trên FUSE nên có thể có vấn đề về hiệu năng và việc không hỗ trợ Windows là thiếu sót. Không rõ có thể dùng được trên WSL hay không
- Một điểm mạnh là đây là mã nguồn mở, vì vậy có thể đóng góp để hỗ trợ nhiều định dạng hơn. Ở góc nhìn người dùng, điều này có vẻ giúp tăng tính tiện dụng và năng suất
- Nếu bạn là kỹ sư đã quen với các công cụ xử lý văn bản truyền thống như
sed hoặc awk, có thể áp dụng ngay mà không tốn chi phí học hỏi
- Có vẻ rất hữu ích khi lưu phản hồi API cục bộ để debug hoặc khi cần chỉnh sửa thường xuyên các file cấu hình bán cấu trúc
1 bình luận
Nhận xét Hacker News
Người dùng đã bọc
libfusemà họ tự viết bằng Nim để port ví dụ file systemhello, rồi tạo một phiên bản có thể truyền dữ liệu qua pipe và cung cấp mount point. Khi hoàn tất, nó ghi kết quả rastdout. Nhờ đó có thể dùng inline trong chuỗi pipeline, nhưng cần chắc chắn phải lấy được output.Hiện đang xem xét những thứ khác cũng có thể biến thành file system. Đã làm một thanh trạng thái cho Nimdow window manager; khi ghi nội dung vào từng file, nó sẽ xuất ra một thanh có các ô khối. Việc thay thế nội dung trong thanh trạng thái rất dễ, rất tiện lợi.
Cũng làm một music player dùng
libvlc. Nó đọc media có ID3 tags và thiết lập các thư mục như theo nghệ sĩ, theo album... Mỗi file được đặt tên'<số thứ tự bài hát> - <tên bài hát>'và chứa full path của file gốc. Để phát nhạc, bạncatmột file như vậy vàocontrol/currentrồi ghiplayvàocontrol/command. Có cả tính năng playlist và nhiều command khác, nhưng đây là ý tưởng cốt lõi. Mục tiêu là làm một trình phát nhạc có khả năng scripting rất mạnh.Hệ điều hành kiểu Unix cho phép mount image đĩa và duyệt nội dung của nó. Tuy nhiên còn rất nhiều định dạng file hữu ích để duyệt file bên trong file hơn thế. Tệp nén là một ví dụ. Một số file manager hỗ trợ tính năng này, nhưng application layer không phải nơi tối ưu để đưa tính năng này vào. Có thể triển khai theo dạng driver cho từng loại file.
Đang tìm một file system FUSE chạy trong RAM khi đang mount (giống như tmpfs), nhưng khi unmount thì serialize thành một file duy nhất trên đĩa. Driver FUSE mount archive file là tương tự nhất, song không thể có các thứ như symbolic link.
Có thể mount Git commit thành file system được. (xem liên kết)
Cũng có File System phần của file. (xem liên kết Usenix)
Gợi lại TabFS của Omar Rizwan. (xem liên kết)
Mình đã làm việc kiểu này năm 2003 rồi. Thật bất ngờ là nó rất nhanh và khóa chi tiết (
fine-grained lock) dễ làm. Đã dùng nó như DB theo user cho ngôn ngữ template của một công cụ xây dựng website khổng lồ.Hỏi về chuyện khi JSON key có dấu
/thì sao.Điều này mở ra khả năng commit file dưới dạng cây thư mục. Mình tò mò điều này ảnh hưởng thế nào tới merge và conflict.
Nghe có vẻ hay, và muốn thử ngay khi có thể. Có vẻ hữu ích để search và duyệt nội dung bên trong JSON.