1P by neo 2달전 | favorite | 댓글 1개

ffs: UNIX 파일시스템으로 JSON 같은 반정형 데이터를 마운트하는 도구

  • ffs는 File Filesystem의 약자로, 반정형 데이터를 파일시스템으로 마운트해서 익숙한 셸 도구로 JSON, YAML 등 트리 구조의 현대적 포맷을 다룰 수 있게 해주는 도구
  • sed 같은 문자열 처리로 JSON을 편집하는 것은 좋은 방법이 아니므로, ffs를 사용하면 좋음
  • 현재 ffs는 JSON, YAML, TOML을 지원하고 있으며, 더 많은 포맷을 지원할 예정

ffs 사용 예제

  • ffs [file] 명령으로 file.blah를 file이란 마운트 포인트에 마운트하고, 수정된 최종 버전의 파일은 stdout으로 출력됨
  • ffs -m MOUNT file로 명시적인 마운트포인트를 지정할 수 있음
  • ffs -o OUTPUT으로 출력 파일을 지정할 수 있음
  • ffs -i file로 파일을 직접 편집할 수 있으며, 볼륨 마운트 해제시 결과가 file에 다시 쓰여짐
  • 편집시 nose 키의 값이 문자열이 아닌 숫자로 되고, pockets 디렉토리가 오브젝트로 변환되는 것을 확인할 수 있음

ffs 설치 방법

  • Linux에서는 FUSE가, macOS에서는 macFUSE가 필요
  • 단일 실행파일을 다운로드 받을 수 있음
  • 소스에서 빌드도 가능

ffs에 대해 더 알아보기

  • PLOS 2021에서 "Files-as-Filesystems for POSIX Shell Data Processing" 논문 참고
  • 데모 영상과 발표 영상 제공

관련 도구 비교

  • jq, gron 등은 CLI에서 JSON을 다루기 위한 좋은 도구
  • ffs는 다양한 포맷 지원, 익숙한 셸 도구로 편집 가능, 새로운 언어 학습 불필요 등의 장점
  • 단, Windows 미지원, FUSE 사용 불가, 검색만 필요할 때, 매우 큰 파일인 경우 등은 ffs가 적합하지 않을 수 있음

GN⁺의 의견

  • JSON, YAML, TOML 등 현대 웹 개발에서 많이 사용되는 반정형 데이터를 다루는데 유용해 보임. 특히 셸 스크립트로 자동화 작업을 하는 경우 강력할 듯
  • 단, FUSE 기반이라 성능 이슈가 있을 수 있고, 윈도우 미지원이 아쉬움. WSL에서는 사용 가능할지 모르겠음
  • 오픈소스인 만큼 다양한 포맷을 지원하도록 기여할 수 있다는 것이 장점. 사용자 입장에서는 편의성과 생산성 향상에 도움이 될 듯
  • sed나 awk 같은 고전적인 텍스트 처리 도구에 익숙한 엔지니어라면 학습 비용 없이 바로 적용 가능
  • API 응답을 로컬에 저장해서 디버깅하거나, 반정형 설정파일을 자주 수정해야 하는 경우 유용할 듯
Hacker News 의견
  • 사용자가 직접 개발한 libfuse를 Nim으로 래핑하여 'hello' 파일 시스템 예제를 포팅하고, 데이터를 파이프로 전달하고 마운트 포인트를 제공하는 버전을 만듦. 완료되면 stdout을 통해 결과를 씀. 이를 통해 파이프 체인에 인라인으로 사용할 수 있지만 출력을 확실히 가져와야 함.

  • 현재 파일 시스템으로 만들 수 있는 다른 것들을 모색 중임. Nimdow 윈도우 매니저용 상태 표시줄을 만들어 개별 파일에 내용을 쓰면 블록이 있는 막대를 출력으로 만듦. 상태 표시줄에 있는 내용을 쉽게 교체할 수 있어 매우 편리함.

  • libvlc를 사용하는 음악 플레이어도 만듦. ID3 태그가 있는 미디어를 읽고 '아티스트별', '앨범별' 등의 폴더를 설정함. 각 파일은 '<트랙 번호> - <노래 제목>'으로 명명되고 실제 파일의 전체 경로를 포함함. 노래를 재생하려면 이러한 파일 중 하나를 'control/current'에 캣하고 'control/command'에 play라는 단어를 씀. 재생 목록 기능과 더 많은 명령어 등이 있지만 기본 아이디어는 이것임. 목표는 초강력 스크립팅 가능한 음악 플레이어를 만드는 것임.

  • Unix 계열 OS는 디스크 이미지를 마운트하여 내용을 탐색할 수 있음. 그러나 파일 내부 파일 탐색에 유용한 파일 형식은 더 많음. 압축 아카이브가 그 중 하나임. 일부 파일 관리자는 이를 지원하지만 애플리케이션 수준은 이 기능을 넣기에 최적의 계층이 아님. 파일 유형별 드라이버로 구현할 수 있음.

  • 마운트되는 동안 메모리 내에서 실행되다가(tmpfs처럼) 마운트 해제되면 디스크의 단일 파일로 직렬화되는 FUSE 파일 시스템을 찾고 있음. 아카이브 파일을 마운트하는 FUSE 드라이버가 가장 유사하지만 심볼릭 링크와 같은 것은 얻을 수 없음.

  • Git 커밋을 파일 시스템으로 마운트할 수도 있음. (링크 참조)

  • Parts-of-file File System도 있음. (Usenix 링크 참조)

  • Omar Rizwan의 TabFS를 연상시킴. (링크 참조)

  • 2003년에 이런 것을 해봤음. 놀랍게도 빠르고 세분화된 잠금을 쉽게 만듦. 거대한 웹사이트 구축 도구를 위한 웹 템플릿 언어의 사용자별 데이터베이스로 사용했음.

  • JSON 키에 슬래시가 있으면 어떻게 되는지에 대한 질문.

  • 이를 통해 파일을 디렉토리 구조로 커밋할 가능성이 열림. 이것이 병합 및 충돌에 어떤 영향을 미칠지 궁금해 함.

  • 멋져 보이며 가능한 한 빨리 시도해 봐야겠다는 의견. JSON 파일 내부를 검색하고 탐색하는 데 유용할 것 같음.