好的。在尝试多次提出这个问题后,我发现这将是一个很长的问题。无论如何:
考虑以下文件结构:
photos/
ants/
pic1.jpg
animals/
dog.png
profile_pic.jpg
如果你这样做
cd photos
ls
你得到
ants/ animals/ profile_pic.jpg
然而,由于目录 vacation 和 animal 只包含一个文件,因此获取
ants/pic1.jpg ani../dog.png profile_pic.jpg
直接访问,而不是必须访问每个动物和度假地。但是,在制表符补全中,如 cd a 中所示,您可能希望使用目录建议。
所以我知道 bash 补全是由 /etc/bash_completion 脚本(我不想去那里)和 readline 库处理的,但这实际上并不影响 ls,如果你想将功能扩展到文件管理器(如 nautilus),这当然也无济于事。因此,我希望可以使用自定义文件系统而不是 fuse 来解决其中一些问题。基于本教程然而有点令人沮丧,因为保险丝文件系统似乎没有区分我的不同用例(每次都是 readdir、opendir、releasedir)。
提出一个问题:如果在内核没有重大修改的情况下也可以实现类似的功能,那么以什么方式可以实现类似的功能?我应该在哪里寻找更多信息?
感谢您的时间!
编辑:澄清一下,bash 是一个有用的例子,但最终我希望通过 nautilus 和访问文件的其他每个程序都能做到这一点,而且无论如何我都会为其他问题编写一个文件系统。
答案1
实现此目的的最简单方法是编写一个 bash 脚本来为您执行此操作。我相当肯定您不会想将其编码到内核或文件系统中 :)
像这样的逻辑应该有效:
进入目录...检查一个文件...打印文件夹/文件...否则打印顶部文件夹
答案2
不幸的是,我无法发表评论,所以我必须写一个“答案”(我仍然不明白这个决定,但别再抱怨了)。既然你已经放弃了这个bash
选择,并暗示了一个FUSE
解决方案,我想在你实施的时候给你几个“或多或少可行”的想法mp3fs
:
增强
struct stat
假设有一个新的类型st_nfiles
。每次你create()/symlink()/hardlink()
创建一个文件时,你都会在相应的FUSE
操作中更新这个条目。确定所引用的目录中是否只有一个条目,然后只需查找并将(struct stat) dirp->st_nfiles
与 1 进行比较。你需要LD_PRELOAD
一个库到你的用户空间,该库劫持并扩展必要的printf
调用以输出stat
此更改的结果。滥用操作代码
(struct stat) dirp->st_nlink
中现有的。缺点可能是依赖于 的工具存在问题;如果我没记错的话,就是其中之一。这还需要一个全局库来处理输出。FUSE
getattr()
st_nlink
find
LD_PRELOAD
即时解析
FUSE
在的操作代码中getattr()
,类似于您在纯用户空间中所做的操作。这代码片段应该可以给你这个想法。
不确定这是否是您想要的。我希望我可以将其添加为评论,而不是半心半意的答案。也许您想bash
从这个问题中删除标签,因为您已经表示这不适合您,因为您希望类似的工具nautilus
以相同的方式运行。