Linux du命令不遍历挂载文件系统

27
如果问题的措辞有误,请让我知道,这可能解释了为什么我找不到答案。 我想使用类似以下命令查找我的主磁盘上的用法:
du -sh /*

问题是我在根级别有许多挂载点,并且我希望du跳过这些挂载点。

我以为-x选项应该可以做到这一点,但要么我误解了它的作用,要么我使用方式不正确。

如何将du应用于仅根磁盘而不遍历其他挂载点?

谢谢


换句话说,您是否正在寻找有关“/bin”、“/etc”和其他位于“/”下的文件夹的摘要用法,同时排除“/run”、“/proc/”、“/sys”等文件夹? - jamieguinan
我还挂载了额外的驱动器在/data/backup等位置,但基本上是正确的。 - Manngo
1
我认为你正确地使用了 du,问题在于 /* 扩展到包括 / 下的每个挂载点,然后 du 遍历每个挂载点,这就破坏了 -x 的用法。解决这个问题的唯一方法可能是使用一个有创意的脚本。 - jamieguinan
@jamieguinan 用/替换/*有什么问题吗?为什么这样做不能解决问题,反而需要一个创意脚本呢? - Dessa Simpson
@DuncanXSimpson / 只会显示 / 的总和。他想要看到非装载文件夹的小计。 - jamieguinan
哦,是的,我没有考虑到那个。无论如何,他们需要的命令是 df -h - Dessa Simpson
2个回答

67

du -x 不会穿越任何遇到的挂载点。但是如果它被要求从一个挂载点 开始,那么它将按照请求执行。


2
进一步说,如果您在根目录中挂载了一个卷,则 du -shx /* 将扫描该卷,因为您是从挂载的卷上开始扫描的。 - Dash
AKA,请勿输入星号:du -hx / - undefined

18

这种方法有些hacky,但似乎可以在shell中实现你想要的功能。

for d in /*; do egrep " ${d} " /proc/mounts > /dev/null || du -sh ${d}; done

如果需要,在du前加上sudo


3
抱歉让您等这么久才接受这个。我认为您上面的评论解释了“-x”选项为什么不起作用,而您提供的答案是一个解决方案。在我的使用中,我对其进行了修改,如下所示:“for i in /*; do if ! mountpoint -q "$i"; then du -sh $i; fi; done;”。谢谢。 - Manngo
3
你可以避免使用for循环:du -d1 -x指从当前目录开始,向下深度为1(即只显示子目录的一级),同时跳过不同文件系统的目录。 我的rootfs是一个ssd,但也挂载了一个zfs raid,我想快速检查占用ssd空间的内容,而不浪费时间在硬盘上;这个命令可以达到这个效果。 - ecloud
但是-s-d1有冲突,这是原来的问题。 - Hrobky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接