检查目录是否是挂载点

检查目录是否是挂载点

我使用 Python 扫描 Unix 安装卷中的文件,然后根据文件的存在情况添加或清除数据库中的文件名。我刚刚意识到,如果正在扫描的卷由于某种原因被卸载,扫描将假定该卷上的每个文件名都应该被清除!哎呀。有没有更好的方法来安装卷或有任何建议?

我唯一能想到的就是在扫描之前检查的每个卷上放置一个永久虚拟文件,从而确保仅在可以找到虚拟文件的情况下才扫描该卷。

答案1

您可以用来mountpoint检查给定目录是否是挂载点。例子

mountpoint /mnt/foo; printf "$?\n"
/dev/foo is a mountpoint
0

mountpoint /mnt/bar; printf "$?\n"
/dev/bar is not a mountpoint
1

正如返回值所示,这可以轻松地用在if脚本的语句中。

答案2

st_dev经典的答案是,如果由返回的字段,则目录是挂载点stat与其父目录或根目录中的值不同。这是大多数工具使用的标准(find -xdevrsync -xdu -x、 …)。这是作为os.path.ismountPython 中的函数。

由于安排文件系统的多种复杂方式,该方法同时存在误报和误报。例如,在 Linux 上,您可以绑定挂载其子目录上的(一部分)文件系统,创建一个安装点,其中父目录位于同一文件系统上。相反,某些具有子卷(至少是 btrfs)的文件系统st_dev在每个子卷上呈现不同的值,但子卷根不是安装点。网络文件系统可能会导致误报和漏报,因为客户端可以将相同的服务器目录安装在不同的路径上,并且可能通过不同的导出来安装。

这不会直接帮助您,因为如果目录为空,并不意味着它在其他时间是挂载点。如果要检测挂载点,则需要在索引时执行此操作。您可能希望在单独的索引中保留单独的挂载点,并且仅更新根存在且非空的索引。请注意,即使未安装常用的文件系统,有时作为安装点的目录也可能不为空,这可能是因为那里安装了其他文件系统,也可能只是因为该目录中有文件(目录中的文件是隐藏的)而该目录是一个挂载点)。

相关内容