好的。在嘗試多次闡述這個問題後,發現這將是一個很長的問題。任何人:
考慮這個文件結構:
photos/
ants/
pic1.jpg
animals/
dog.png
profile_pic.jpg
如果你這樣做
cd photos
ls
你得到
ants/ animals/ profile_pic.jpg
然而,由於目錄 Vacation 和 Animals 僅包含一個文件,因此可以說獲取更有用
ants/pic1.jpg ani../dog.png profile_pic.jpg
直接,而不是必須去拜訪每一個動物和度假。然而,在製表符完成時,如在 cd a 中,您可能需要目錄建議。
所以我知道 bash 完成是由 /etc/bash_completion 腳本(我不想去那裡)和 readline 庫處理的,但這並不會真正影響 ls 並且如果您想將功能擴展到文件當然沒有幫助經理們就是這樣的鸚鵡螺。因此,我希望可以使用熔絲上的自訂檔案系統來解決其中的一些問題。初步調查基於本教程不過有點令人沮喪,因為保險絲檔案系統似乎根本無法區分我的不同用例(每次都是 readdir、opendir、releasedir)。
提出一個問題:如果無需對核心進行重大修改就可以實現類似的功能,那麼可以透過什麼方式實現類似的功能?我應該在哪裡尋找更多資訊?
謝謝你的時間!
編輯:為了澄清,bash 是一個有用的例子,但最終我希望透過 nautilus 和存取檔案的每個其他程式都是一樣的,無論如何我都會為其他問題編寫一個檔案系統。
答案1
完成此操作的最簡單方法是編寫一個 bash 腳本來為您執行此操作。我相當確定您不會想將其編碼到核心或檔案系統:)
像這樣的邏輯應該要有效:
下降到目錄...檢查是否有一個檔案...列印資料夾/檔案...否則列印頂層資料夾
答案2
不幸的是,我無法發表評論,所以我必須寫一個「答案」(我仍然不明白這個決定,但已經足夠咆哮了)。由於您已經放棄了該bash
選項並暗示了FUSE
解決方案,因此我想在您實現以下方案時為您提供一些“或多或少可行”的想法mp3fs
:
增強
struct stat
假設有一種新類型st_nfiles
。每次建立create()/symlink()/hardlink()
文件時,您都會在相應的FUSE
操作中更新此條目。確定所引用的目錄中是否只有一個條目,則只需進行查找並與1(struct stat) dirp->st_nfiles
進行比較。LD_PRELOAD
printf
stat
濫用您的操作代碼
(struct stat) dirp->st_nlink
中現有的.缺點可能是依賴的工具有問題;如果我沒記錯的話,就是其中之一。這還需要一個全域庫來處理輸出。FUSE
getattr()
st_nlink
find
LD_PRELOAD
即時解析
FUSE
在的操作程式碼中getattr()
,類似於您在純用戶空間中執行的操作。這程式碼片段應該能給你這個想法。
不確定這是否是您想要的。我希望我可以將其添加為評論,而不是半支持的答案。也許您想bash
從這個問題中刪除標籤,因為您已經表明這不適合您,因為您希望類似的工具nautilus
具有相同的行為方式。