洗練された readdir または bash 補完動作を備えたカスタム ファイルシステム

洗練された readdir または bash 補完動作を備えたカスタム ファイルシステム

わかりました。この質問を何度か考えてみたのですが、長くなりそうです。とにかく:

次のファイル構造を検討してください。

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

もし、するなら

cd photos
ls

あなたは得る

ants/    animals/    profile_pic.jpg

しかし、ディレクトリvacationとanimalsにはそれぞれ1つのファイルしか含まれていないので、

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

動物や休暇のそれぞれを訪問する代わりに、直接。ただし、CD A の場合のように、タブ補完では、代わりにディレクトリの提案が必要になります。

bash の補完は /etc/bash_completion スクリプト (そこまでは行きたくない) と readline ライブラリによって処理されることはわかっていますが、これは ls にはあまり影響しませんし、nautilus などのファイル マネージャに機能を拡張したい場合には役に立ちません。そのため、fuse を介したカスタム ファイルシステムを使用して、この問題の一部に対処できるのではないかと期待していました。このチュートリアルしかし、fuse ファイル システムは、異なるユース ケース (毎回 readdir、opendir、releasedir) をまったく区別していないようで、少しがっかりしました。

質問をまとめると、カーネルを大幅に改訂しなくても同様の機能を実現できるとしたら、どのような方法で実現できるでしょうか。さらに詳しい情報はどこで調べればよいでしょうか。

お時間をいただきありがとうございます!

編集: 明確にするために、bash は便利な例ですが、最終的には、nautilus やファイルにアクセスする他のすべてのプログラムでこれを同じにしたいので、他の問題のためにとにかくファイル システムを作成するつもりです。

答え1

これを実現する最も簡単な方法は、これを行う bash スクリプトを作成することです。これをカーネルまたはファイルシステムにコード化することはおそらく望ましくないでしょう :)

次のようなロジックが機能するはずです:

ディレクトリに降りて... 1 つのファイルがあるかどうか確認し... フォルダー/ファイルを印刷し... ない場合は最上位のフォルダーを印刷します

答え2

残念ながら、コメントを投稿できないので、「回答」を書かなければなりません (この決定をまだ理解していませんが、文句を言うのはもう十分です)。すでにオプションを破棄して解決策bashを示唆しているのでFUSE、実装中に「多かれ少なかれ実行可能な」アイデアをいくつか提供したいと思いますmp3fs

  • 強化 struct stat新しいタイプ、たとえば を使用します。ファイルを使用するst_nfilesたびに、それぞれの操作でこのエントリを更新します。参照先のディレクトリにエントリが 1 つしかないかどうかを判断するには、 と 1 の検索と比較を行うだけです。この変更の結果を出力するために必要な呼び出しをハイジャックして拡張するライブラリをユーザー スペースに追加する必要があります。 create()/symlink()/hardlink()FUSE(struct stat) dirp->st_nfilesLD_PRELOADprintfstat

  • 誤用の操作コード(struct stat) dirp->st_nlinkにが存在します。欠点は に依存するツールに問題がある可能性があります。私の記憶が正しければ、がその 1 つです。これには、出力を操作するためのグローバル ライブラリも必要です。FUSEgetattr()st_nlinkfindLD_PRELOAD

  • オンザフライ解析FUSEの操作コードではgetattr()、純粋なユーザー空間で行う操作と同様です。これコード スニペットを見ればそのアイデアがわかるはずです。

これがあなたが望んでいることかどうかはわかりません。中途半端な回答ではなく、コメントとしてこれを追加できればよかったと思います。bashツールが同じように動作することを望んでいるので、これはあなたには適していないと示しているので、この質問からタグを削除したいのかもしれnautilusません。

関連情報