멋진 readdir 또는 bash 완료 동작을 갖춘 사용자 정의 파일 시스템

멋진 readdir 또는 bash 완료 동작을 갖춘 사용자 정의 파일 시스템

좋아요. 이 질문을 몇 번 공식화하려고 시도한 후에 이것이 긴 질문이 될 것이라는 것이 밝혀졌습니다. 누구나:

다음 파일 구조를 고려하십시오.

photos/ 
  ants/ 
    pic1.jpg
  animals/ 
    dog.png
  profile_pic.jpg

당신이 그렇게한다면

cd photos
ls

당신은 얻는다

ants/    animals/    profile_pic.jpg

그러나 휴가 및 동물 디렉토리에는 각각 하나의 파일만 포함되어 있으므로 다음을 가져오는 것이 더 유용할 수 있습니다.

ants/pic1.jpg    ani../dog.png    profile_pic.jpg

각 동물을 방문하고 휴가를 보내는 것이 아니라 직접적으로 말이죠. 그러나 탭 완성 시에는 cd a에서와 같이 디렉터리 제안이 필요할 수 있습니다.

그래서 나는 bash 완료가 /etc/bash_completion 스크립트(거기에 가고 싶지 않음)와 readline 라이브러리에 의해 처리된다는 것을 알고 있지만 이것은 실제로 ls에 영향을 미치지 않으며 기능을 파일로 확장하려는 경우에는 확실히 도움이 되지 않습니다. 그런 노틸러스 같은 관리자. 그러므로 나는 이 중 일부가 퓨즈를 통한 사용자 정의 파일 시스템을 사용하여 해결될 수 있기를 바랐습니다. 에 기초한 초기 조사이 튜토리얼하지만 퓨즈 파일 시스템은 나의 다양한 사용 사례(매번 readdir, opendir, releaseir)를 전혀 구별하지 못하는 것 같았기 때문에 다소 우울했습니다.

질문을 공식화하자면: 커널의 주요 개정 없이도 유사한 기능에 접근할 수 있는 방법은 무엇입니까? 자세한 내용은 어디에서 찾아봐야 합니까?

시간 내주셔서 감사합니다!

편집: 명확히 하기 위해 bash는 유용한 예이지만 결국에는 노틸러스와 파일에 액세스하는 다른 모든 프로그램을 통해 이것이 동일해지기를 원하며 어쨌든 다른 문제에 대해 파일 시스템을 작성할 것입니다.

답변1

이를 수행하는 가장 쉬운 방법은 이를 수행하는 bash 스크립트를 작성하는 것입니다. 나는 당신이 이것을 커널이나 파일 시스템에 코딩하고 싶지 않을 것이라고 확신합니다 :)

다음과 같은 논리가 작동해야 합니다.

디렉터리로 내려갑니다... 파일이 하나인지 확인합니다... 폴더/파일을 인쇄합니다... 그렇지 않으면 최상위 폴더를 인쇄합니다

답변2

아쉽게도 댓글을 올릴 수 없어서 "답변"을 작성해야 합니다. (아직도 이 결정이 이해가 안 되지만 호언장담은 이 정도로 했습니다.) 이미 옵션을 포기 bash하고 해결책을 암시했으므로 FUSE다음을 구현하는 동안 "다소 실행 가능한" 몇 가지 아이디어를 제공하고 싶습니다 mp3fs.

  • 강화 struct stat새로운 유형으로 가정 해 봅시다 st_nfiles. 파일을 생성할 때마다 create()/symlink()/hardlink()해당 작업에서 이 항목을 업데이트하게 됩니다 FUSE. 참조된 디렉터리에 항목이 하나만 있는지 알아내는 것은 단순히 1과의 조회 및 비교일 뿐입니다 . 이 변경으로 결과를 출력하는 데 필요한 호출을 가로채고 확장하는 사용자 공간에 대한 라이브러리가 (struct stat) dirp->st_nfiles필요합니다 .LD_PRELOADprintfstat

  • 오용작업 코드 (struct stat) dirp->st_nlink의 기존 . 단점은 에 의존하는 도구의 문제일 수 있습니다 . 내 기억이 맞다면 그중 하나다. 또한 출력을 조정하려면 전역 라이브러리가 필요합니다.FUSEgetattr()st_nlinkfindLD_PRELOAD

  • 즉시 구문 분석순수 사용자 공간에서 수행하는 작업과 유사 합니다 FUSE.getattr()이것코드 조각을 보면 아이디어가 나올 것입니다.

이것이 당신이 원하는 것인지 확실하지 않습니다. 나는 이것을 반쯤 뒷받침되는 답변이 아닌 의견으로 추가할 수 있었으면 좋았을 것입니다. 도구가 동일한 방식으로 작동하기를 bash원하기 때문에 이것이 적합하지 않다고 표시했기 때문에 이 질문에서 태그를 제거하고 싶을 수도 있습니다 .nautilus

관련 정보