फ़ाइल सिस्टम ‘File Filesystem’ जारी (2021)
(mgree.github.io)- ffs(file filesystem) एक ऐसा टूल है जो JSON, YAML, TOML जैसे semi-structured data को फ़ाइल सिस्टम के रूप में mount करके Unix shell tools से explore और edit करने देता है
- Unix shell में string processing tools काफी हैं, लेकिन इसकी मूल data structure file system है, इसलिए यह tree-shaped data को edit करने के लिए अच्छी तरह fit नहीं बैठता
ffs [file]फ़ाइल को mount point से जोड़ता है और unmount करने पर updated result को stdout या तय output file में भेजता है- फ़ाइल लिखना और directory बनाना JSON keys और objects में convert होता है, और
1,true,false, खाली फ़ाइल क्रमशः number, boolean, null values के रूप में reflect होते हैं - Linux पर FUSE, macOS पर macFUSE चाहिए, और यह Windows, ऐसे environment जहाँ FUSE इस्तेमाल नहीं हो सकता, केवल search वाले काम, या बहुत बड़ी फ़ाइलों के लिए उपयुक्त नहीं हो सकता
Semi-structured data को directory की तरह संभालना
- ffs का मतलब file filesystem है; यह semi-structured data को file system की तरह mount करके परिचित shell tools से काम करने देता है
- अभी supported formats JSON, YAML, TOML हैं, और आगे और formats support करने की योजना है
- विस्तृत usage
ffsmanpage में देखा जा सकता है
Mount और edit workflow
- Default execution
ffs [file]है; यहfile.blahकोfilemount point पर mount करता है और final updated version को stdout पर output करता है ffs -m MOUNT fileसे explicit mount point specify किया जा सकता है, और-o OUTPUTसे output file specify की जा सकती हैffs -i fileफ़ाइल को inplace edit करता है; volume को unmount करने पर result वापसfileमें लिखा जाता है-
Example में दिखने वाले conversion rules
echo Mikey Indiana >object/nameJSON केnamevalue को बदलता हैecho 1 >object/nosestring नहीं, बल्कि number1के रूप में reflect होता हैmkdir object/pocketsऔर उसके अंदर की files JSON object में convert होती हैं- खाली फ़ाइल
mistakesJSON मेंnullके रूप में record होती है
Installation requirements और distribution
- Linux में FUSE चाहिए
- macOS में macFUSE चाहिए
- Latest development builds Linux, macOS single executables के रूप में उपलब्ध हैं
- Specific releases release page पर देखे जा सकते हैं, और current version 0.1.2 है
- source से भी build किया जा सकता है
Related resources और comparison points
- PLOS 2021 paper “Files-as-Filesystems for POSIX Shell Data Processing” उपलब्ध है
- jq और gron command line पर JSON संभालने वाले tools हैं
- ffs की अलग पहचान यह है कि यह कई formats support करता है, परिचित shell tools से edit करने देता है, और नई language सीखने की जरूरत नहीं पड़ती
- Windows usage, FUSE न इस्तेमाल कर पाने की स्थिति, केवल search की जरूरत वाले काम, और बहुत बड़ी files ffs के लिए उपयुक्त नहीं हो सकते
- License GPLv3 है
1 टिप्पणियां
Hacker News टिप्पणियाँ
यह कमाल का है। हाल ही में मैंने libfuse को Nim में wrap करने के बाद
hellofilesystem example को port किया, और लगभग यही चीज़ बनाकर देखीमेरे version में data को pipe से देना पड़ता है और mount point specify करना पड़ता है, और काम खत्म होने पर result को standard output पर लिखता है। इसलिए इसे pipe chain के अंदर फिट किया जा सकता है, लेकिन output भी खुद संभालना पड़ता है
अभी मैं यह भी तलाश रहा हूँ कि क्या दूसरी चीज़ों को भी filesystem बनाया जा सकता है। मैंने Nimdow window manager के लिए एक status bar भी बनाई, जहाँ individual files में content लिखने पर blocks वाली bar output के रूप में बनती है, जिससे status bar की सामग्री को आसानी से बदला जा सकता है
एक और tool जो बनाया, वह libvlc-आधारित music player है। उसे folder देने पर वह ID3 tags वाले media को पढ़ता है और
by-artist,by-albumजैसे folders बनाता है। हर file का नाम-होता है और उसमें actual file का full path होता है। गाना चलाने के लिए किसी file कोcontrol/currentपरcatकरना होता है औरcontrol/commandमेंplayलिखना होता है। playlist features और commands और भी हैं, लेकिन लक्ष्य ऐसा music player बनाना है जिसे script करना बहुत आसान होअगर codebase की structure समझनी हो तो बस
treeचला लो :)और गहराई में जाएँ तो imports को symbolic links वगैरह के रूप में resolve भी किया जा सकता है, काफ़ी दिलचस्प संभावनाएँ हैं
उदाहरण के लिए music player का current track name पाने के लिए
cat /proc/$pid/fs/current_track, या browser के खुले tabs की list देखने के लिएls /proc/$pid/fs/tabsजैसा कुछ। शायद HTML या embedded images भी निकाली जा सकती होंअभी भी यह FUSE से किया जा सकता है, लेकिन इतना झंझट वाला है कि कोई करता नहीं
यह काफ़ी उपयोगी है, इसलिए इसे operating system स्तर की standard feature होना चाहिए
Unix-परिवार के operating systems disk images को mount करके उनका content देखने देते हैं। लेकिन file के अंदर file को explore करना हो तो उपयोगी formats इससे कहीं ज़्यादा हैं। compressed archives इसका बढ़िया उदाहरण हैं
कुछ file managers इसे support करते हैं, लेकिन इसे application layer में रखना सबसे सही जगह नहीं लगता। शायद file-format-specific drivers की तरह implement किया जा सकता है
filecommand जैसी होगी, और यह सब user space में संभव होना चाहिएअभी इसे रोकने वाला एकमात्र कारण यह है कि MacOS user-space filesystem API expose नहीं करता। Linux, Windows, BSD में यह पहले से संभव है
अगर कोई Apple developer यह पढ़ रहा हो, तो file provider extensions काफ़ी नहीं हैं। FUSE के बराबर कुछ दीजिए। मुझे पता है कि वह मौजूद है
https://avf.sourceforge.net/
खैर, अगर वही आपकी चाहत नहीं भी है, तो FUSE कहीं ज़्यादा general mechanism है, इसलिए यह आपकी ज़रूरत का काम करा सकता है, और शायद उससे भी ज़्यादा
git commits को filesystem की तरह mount भी किया जा सकता है
https://jvns.ca/blog/2023/12/04/mounting-git-commits-as-fold...
पिछली पोस्ट: https://news.ycombinator.com/item?id=38527866
शीर्षक देखकर मैं उत्साहित हो गया था कि शायद यह वही चीज़ है जिसे मैं पहले ढूँढ़ रहा था या खुद बनाना चाहता था। लगा यहाँ पूछना ठीक रहेगा
क्या ऐसा कोई FUSE filesystem है जो mounted रहते समय tmpfs की तरह memory में चले, और unmount करते समय उसे disk पर एक single file में serialize कर दे?
archive files को mount करने वाले FUSE drivers सबसे क़रीब लगते हैं, लेकिन फिर symbolic links जैसी चीज़ें पाना मुश्किल हो जाता है
libsqlfs SQLite database के ऊपर POSIX-style filesystem implement करता है। यह single file के अंदर अपने hierarchy और namespace के साथ read/write filesystem देता है, और shared library या FUSE module की तरह इस्तेमाल किया जा सकता है
OSX के DMG जितना polished नहीं है, लेकिन उदार नज़र से देखें तो काफ़ी मिलता-जुलता उद्देश्य पूरा करता है
या फिर tmpfs को wrap करके ऐसा बनाया जा सकता है कि unmount के समय उसे symbolic links सुरक्षित रखने वाले tarball में serialize कर दे
शायद आपको पहले से पता होगा, लेकिन अगर buffers सिर्फ unmount के समय flush हों, तो data corruption तक ले जाने वाले कई व्यावहारिक scenarios होते हैं
फिर भी आप जो समस्या हल करना चाहते हैं, वह दिलचस्प लगती है
/tmpमें copy करके इस्तेमाल करें और unmount के बाद उसे disk पर वापस ले जाएँ, तो काफ़ी हद तक वैसा ही होगाParts-of-file File System भी है: https://www.usenix.org/conference/2005-usenix-annual-technic...
Omar Rizwan का TabFS याद आ गया: <https://omar.website/tabfs/>
मैंने 2003 में यह किया था। हैरानी की बात है कि यह तेज़ था, और fine-grained locking करना आसान हो गया था
इसे मैंने एक बड़े website creation tool की web template language में per-user database की तरह इस्तेमाल किया था
शीर्षक देखकर पहले लगा यह कोई meme है
लेकिन यह सच में बहुत चतुर idea है। व्यक्तिगत रूप से मैं ज़्यादातर data processing ऊँची-स्तर की languages में करता हूँ, इसलिए खुद शायद कम इस्तेमाल करूँ, लेकिन मुझे लगता है कि कुछ लोग इसके अच्छे use cases ज़रूर ढूँढ़ लेंगे
यह box के बाहर सोचने वाला अच्छा approach है
यह सच में बढ़िया लग रहा है, इसे जल्द से जल्द आज़माना चाहिए
JSON files के अंदर browse या search करने के लिए यह बहुत काम आ सकता है
अगर यह दिलचस्प लग रहा है, तो Solvent-Configr भी आपको पसंद आ सकता है
https://aws.amazon.com/marketplace/pp/prodview-i3ym46leenag4
यह filesystem mechanism से objects को model करता है, ताकि filesystem-style navigation support करने वाले object-based solutions design किए जा सकें
demo: https://youtu.be/XgTgubZQPHw