具有精美 readdir 或 bash 完成行为的自定义文件系统

具有精美 readdir 或 bash 完成行为的自定义文件系统

好的。在尝试多次提出这个问题后,我发现这将是一个很长的问题。无论如何:

考虑以下文件结构:

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中现有的。缺点可能是依赖于 的工具存在问题;如果我没记错的话,就是其中之一。这还需要一个全局库来处理输出。FUSEgetattr()st_nlinkfindLD_PRELOAD

  • 即时解析FUSE在的操作代码中getattr(),类似于您在纯用户空间中所做的操作。代码片段应该可以给你这个想法。

不确定这是否是您想要的。我希望我可以将其添加为评论,而不是半心半意的答案。也许您想bash从这个问题中删除标签,因为您已经表示这不适合您,因为您希望类似的工具nautilus以相同的方式运行。

相关内容