Ra mắt hệ thống tệp ‘File Filesystem’ (2021)
(mgree.github.io)- ffs(file filesystem) là công cụ cho phép mount dữ liệu bán cấu trúc như JSON, YAML, TOML dưới dạng hệ thống tệp để có thể duyệt và chỉnh sửa bằng các công cụ Unix shell
- Unix shell có nhiều công cụ xử lý chuỗi phong phú, nhưng vì cấu trúc dữ liệu cơ bản là hệ thống tệp, nên không thực sự phù hợp để chỉnh sửa dữ liệu dạng cây
ffs [file]sẽ gắn tệp vào mount point, và khi unmount sẽ xuất kết quả đã cập nhật ra stdout hoặc ra tệp đầu ra được chỉ định- Việc ghi tệp và tạo thư mục sẽ được chuyển thành key JSON và object, trong đó
1,true,false, tệp rỗng sẽ lần lượt được phản ánh thành giá trị số, boolean, và null - Linux cần FUSE, macOS cần macFUSE, và công cụ này có thể không phù hợp với Windows, môi trường không dùng được FUSE, tác vụ chỉ đọc để tìm kiếm, hoặc các tệp rất lớn
Xử lý dữ liệu bán cấu trúc như thư mục
- ffs là viết tắt của file filesystem, cho phép mount dữ liệu bán cấu trúc như một hệ thống tệp để làm việc bằng các công cụ shell quen thuộc
- Các định dạng hiện được hỗ trợ là JSON, YAML, TOML, và dự kiến sẽ hỗ trợ thêm nhiều định dạng khác
- Có thể xem cách dùng chi tiết trong
ffsmanpage
Quy trình mount và chỉnh sửa
- Cách chạy cơ bản là
ffs [file], sẽ mountfile.blahvào mount pointfilevà in bản cập nhật cuối cùng ra stdout - Có thể chỉ định mount point rõ ràng bằng
ffs -m MOUNT file, và chỉ định tệp đầu ra bằng-o OUTPUT ffs -i filesẽ chỉnh sửa tệp tại chỗ, và khi unmount volume thì kết quả sẽ được ghi trở lại vàofile-
Quy tắc chuyển đổi thể hiện trong ví dụ
echo Mikey Indiana >object/namesẽ thay đổi giá trịnametrong JSONecho 1 >object/nosesẽ được phản ánh thành số1, không phải chuỗimkdir object/pocketsvà các tệp bên trong nó sẽ được chuyển thành object JSON- Tệp rỗng
mistakessẽ được ghi lànulltrong JSON
Điều kiện cài đặt và phân phối
- Trên Linux cần FUSE
- Trên macOS cần macFUSE
- Bản build phát triển mới nhất được cung cấp dưới dạng tệp thực thi đơn cho Linux và macOS
- Có thể xem các bản phát hành cụ thể trên release page, và phiên bản hiện tại là 0.1.2
- Cũng có thể build từ source
Tài liệu liên quan và các điểm so sánh
- Có bài báo PLOS 2021 “Files-as-Filesystems for POSIX Shell Data Processing”
- jq và gron là các công cụ xử lý JSON trên dòng lệnh
- Điểm khác biệt của ffs là hỗ trợ nhiều định dạng, có thể chỉnh sửa bằng các công cụ shell quen thuộc, và không cần học một ngôn ngữ mới
- ffs có thể không phù hợp nếu dùng Windows, không thể dùng FUSE, chỉ cần thao tác tìm kiếm, hoặc làm việc với các tệp rất lớn
- Giấy phép là GPLv3
1 bình luận
Ý kiến trên Hacker News
Cái này hay đấy. Gần đây tôi bọc libfuse bằng Nim rồi port ví dụ hệ thống tệp
hello, và cũng thử làm một thứ gần như tương tựPhiên bản của tôi cần đưa dữ liệu vào bằng pipe và chỉ định điểm mount; khi xong thì ghi kết quả ra đầu ra chuẩn. Vì vậy có thể chèn nó vào một chuỗi pipe, nhưng cũng phải tự lo phần đầu ra
Hiện tôi đang khám phá xem có thể biến những thứ khác thành hệ thống tệp không. Tôi cũng làm một thanh trạng thái cho trình quản lý cửa sổ Nimdow; khi ghi nội dung vào từng tệp riêng lẻ, một thanh có các block sẽ được tạo ở đầu ra, nên có thể dễ dàng thay nội dung thanh trạng thái
Một công cụ khác tôi làm là trình phát nhạc dựa trên libvlc. Khi đưa vào một thư mục, nó đọc các media có thẻ ID3 và tạo các thư mục như
by-artist,by-album. Mỗi tệp có tên là-và chứa đường dẫn đầy đủ của tệp thật. Để phát một bài, chỉ cầncatmột tệp vàocontrol/currentrồi ghiplayvàocontrol/command. Nó còn có thêm tính năng playlist và lệnh khác, nhưng mục tiêu là tạo một trình phát nhạc cực kỳ dễ scriptNếu muốn nắm cấu trúc codebase thì chỉ cần chạy
tree:)Đi sâu hơn nữa, có lẽ cũng có thể diễn giải import thành symbolic link, v.v.; có rất nhiều khả năng thú vị
Ví dụ như
cat /proc/$pid/fs/current_trackđể lấy tên bài hiện tại của trình phát nhạc, hoặcls /proc/$pid/fs/tabsđể xem danh sách tab đang mở của trình duyệt. Có khi còn có thể lấy cả HTML hoặc ảnh nhúngHiện giờ FUSE cũng làm được, nhưng phiền phức nên chẳng ai làm
Tôi thấy nó đủ hữu ích để nên trở thành tính năng chuẩn ở cấp hệ điều hành
Các hệ điều hành họ Unix có thể mount ảnh đĩa để xem nội dung. Nhưng nếu duyệt các tệp nằm bên trong một tệp, số định dạng hữu ích còn nhiều hơn nhiều. Ví dụ điển hình là các kho lưu trữ nén
Một số trình quản lý tệp có hỗ trợ chuyện này, nhưng tôi không nghĩ đặt nó ở tầng ứng dụng là vị trí tối ưu. Có thể triển khai theo kiểu driver cho từng định dạng tệp
file, và tất cả nên làm được trong user spaceYếu tố duy nhất đang cản trở hiện nay là MacOS không phơi bày API hệ thống tệp user-space. Trên Linux, Windows, BSD thì đã làm được rồi
Nếu có lập trình viên Apple nào đang đọc: file provider extension là chưa đủ. Hãy cho chúng tôi thứ tương đương FUSE. Tôi biết nó có tồn tại
https://avf.sourceforge.net/
Dù sao thì, ngay cả nếu đó không phải thứ bạn muốn, FUSE là một cơ chế tổng quát hơn và có vẻ sẽ cho phép bạn làm điều mình muốn, thậm chí hơn thế nữa
Cũng có thể mount các commit git thành hệ thống tệp
https://jvns.ca/blog/2023/12/04/mounting-git-commits-as-fold...
Bài trước: https://news.ycombinator.com/item?id=38527866
Nhìn tiêu đề tôi đã kỳ vọng vì tưởng đây là thứ mình từng tìm, hoặc từng định tự làm. Có lẽ hỏi ở đây là hợp lý
Có hệ thống tệp FUSE nào chạy trong bộ nhớ như tmpfs khi đang được mount, rồi khi unmount thì serialize thành một tệp duy nhất trên đĩa không?
Gần nhất là các driver FUSE mount tệp archive, nhưng như vậy khó có được những thứ như symbolic link
libsqlfs triển khai một hệ thống tệp kiểu POSIX trên cơ sở dữ liệu SQLite. Nó cung cấp hệ thống tệp đọc/ghi trong một tệp duy nhất, có phân cấp và namespace riêng, và có thể dùng như shared library hoặc module FUSE
So với DMG của OSX thì thô hơn, nhưng nếu nhìn rộng rãi thì đạt mục đích tương tự
Hoặc cũng có thể bọc tmpfs để khi unmount thì serialize thành tarball có bảo toàn symbolic link
Chắc bạn đã biết, nhưng có nhiều kịch bản thực tế trong đó chỉ flush buffer khi unmount có thể dẫn đến hỏng dữ liệu
Dù vậy, vấn đề bạn đang cố giải có vẻ thú vị
/tmpđể dùng, rồi sau khi unmount thì chuyển nó ra đĩaCũng có Parts-of-file File System: https://www.usenix.org/conference/2005-usenix-annual-technic...
Làm tôi nhớ đến TabFS của Omar Rizwan: <https://omar.website/tabfs/>
Tôi đã làm việc này vào năm 2003. Đáng ngạc nhiên là nó nhanh, và giúp khóa chi tiết dễ hơn
Tôi dùng nó như cơ sở dữ liệu theo người dùng trong một ngôn ngữ template web cho công cụ tạo website khổng lồ
Khi nhìn tiêu đề, tôi tưởng đây là meme
Nhưng hóa ra là một ý tưởng thật sự thông minh. Cá nhân tôi chủ yếu xử lý dữ liệu ở các ngôn ngữ cấp cao hơn nên không rõ mình có dùng trực tiếp không, nhưng chắc sẽ có người tìm ra use case
Một cách tiếp cận hay, nghĩ ngoài khuôn khổ
Trông rất tuyệt, tôi phải thử càng sớm càng tốt
Có vẻ rất hữu ích để duyệt hoặc tìm kiếm bên trong tệp JSON
Nếu thấy cái này thú vị thì có thể bạn cũng sẽ quan tâm Solvent-Configr
https://aws.amazon.com/marketplace/pp/prodview-i3ym46leenag4
Bằng cách mô hình hóa đối tượng bằng cơ chế hệ thống tệp, bạn có thể thiết kế các giải pháp dựa trên đối tượng hỗ trợ duyệt kiểu hệ thống tệp
Demo: https://youtu.be/XgTgubZQPHw