【发布时间】:2011-04-04 17:20:31
【问题描述】:
我需要递归地列出一个目录,但我想跳过已经挂载的子目录。 有两种情况:
a) 一个文件系统被挂载了两次,如下例所示:
- “/dev/sda2”挂载在“/mnt/mnt_point1”上
- “/dev/sda2”安装在“/mnt/mnt_point2”上 我想列出“/mnt”,但只在“/mnt/mnt_point1”中下降
b) 文件层次结构的一部分被重新挂载到其他地方,使用“mount --bind”:
- "mount --bind /home/user/tmp/test /home/user/tmp/mounted_test"
我想列出“/home/user/tmp”,但只在“test”中下降
“statfs”和“statvfs”不提供任何信息来判断一个目录是否被挂载了两次。
一种解决方案是读取“/etc/mtab”(就像“find”命令那样)并执行一些检查,但我认为这非常昂贵(每次遇到时都必须读取 /etc/mtab一个目录;如果该文件仅在程序启动时读取,则在读取之间可能会发生挂载,因此程序将不准确)。
另一种解决方案是过滤内核事件(通过 libudev 或 Netlink)并仅在发出 MOUNT 事件时读取 /etc/mtab。
您还有其他建议吗?提前致谢。
【问题讨论】:
-
@Jens:删除了它(以及 C 标记),理由是这是一个与这两种语言都无关的问题。
-
对于大多数 Unix 变体,您不能两次挂载同一个文件系统 - 系统不会让您挂载。当然不适用于本地文件系统; NFS 可能会有所不同。你确定 Linux 允许双挂载吗?
-
@Jonathan Leffler:是的,正如 baudolino 指出的那样,使用
-bind选项,您甚至可以只挂载其他目录。这为您提供了一项功能,就好像您可以对目录执行“临时硬链接”之类的操作。
标签: linux