du -x 使用通配符时仍会检查已挂载的文件系统

du -x 使用通配符时仍会检查已挂载的文件系统

如果我尝试

du -s -h -x /*

它将尝试检查直接安装在 / 下的所有文件系统(真实的和伪的),例如 /dev、/proc、/sys、/run 和 /home(/home 位于额外的分区上)。

我认为它来自 * 的 shell 扩展,为 du 提供了一个明确包含这些挂载点的参数列表。

有没有办法让 du 不检查已挂载的文件系统,即使挂载点包含在参数列表中?

我真的不想输入 / 的所有子目录只是为了避免它们出现在参数列表中。

答案1

您仍然可以使用以下方法进行过滤mountpoint(如果您的系统上可用):

for a in /*; do mountpoint -q -- "$a" || du -s -h -x "$a"; done

如果mountpoint不可用但是stat是(虽然stat仍然不是 POSIX,但它可能更常见),您将必须stat手动比较输出:

rootdevice="$(stat -c %D /)"
for a in /*; do [ "$rootdevice" = "$(stat -c %D -- "$a")" ] && du -s -h -x "$a"; done

答案2

我想你是对的。你实际上是在说,,,du /dev所以“ -x”选项毫无意义。du /sysdu /usrdu /home

你为什么不循环遍历它?例如find / -maxdepth 1 | egrep -v home|media将列出除 home 和 media 之外的所有目录。然后你可以将输出通过管道传送到while循环中du

find / -maxdepth 1 | egrep -v home|media | while read f; do
  du -s -h -x "$f"; 
done

答案3

*在您的命令中不使用du。请使用类似命令:

du -hx --max-depth=1| sort -h

或者

du -hx / --max-depth=1| sort -h

相关内容