わかりました。この質問を何度か考えてみたのですが、長くなりそうです。とにかく:
次のファイル構造を検討してください。
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_nfiles
LD_PRELOAD
printf
stat
誤用の操作コード
(struct stat) dirp->st_nlink
にが存在します。欠点は に依存するツールに問題がある可能性があります。私の記憶が正しければ、がその 1 つです。これには、出力を操作するためのグローバル ライブラリも必要です。FUSE
getattr()
st_nlink
find
LD_PRELOAD
オンザフライ解析
FUSE
の操作コードではgetattr()
、純粋なユーザー空間で行う操作と同様です。これコード スニペットを見ればそのアイデアがわかるはずです。
これがあなたが望んでいることかどうかはわかりません。中途半端な回答ではなく、コメントとしてこれを追加できればよかったと思います。bash
ツールが同じように動作することを望んでいるので、これはあなたには適していないと示しているので、この質問からタグを削除したいのかもしれnautilus
ません。