让我从一个例子开始:
- “/”或根文件系统大小为 10GB,当前 100% 使用。
- “/usr”是“/”下的目录。
- “/usr/something”是一个单独的逻辑卷或安装点,看起来不错。
- “/var”是一个单独的 LV,看起来也不错。
当我们检查哪个目录/文件正在消耗根卷上的磁盘空间时,我们使用“du”命令,如下所示:
du -sh /*
但是,这也包括其他分区/卷。
du -x -sh /*
那也做同样的事情。它不排除其他磁盘卷。然而,手册页说:
-x, --one-file-system 跳过不同文件系统上的目录
如果我们看到“/usr”消耗了根文件系统上的大部分磁盘空间,并且它是“/”下的目录,那么对其运行“du -x -sh /usr/*”也会报告“/usr/something” “这是一个单独的磁盘,并且尺寸很大,导致命令退出时有很多延迟。
底线:如何在运行“du”命令或任何其他命令时仅显示“一个文件系统”来识别磁盘使用情况和罪魁祸首文件,不包括该目录/文件系统下的任何其他磁盘卷?
谢谢!
答案1
du
正在完全按照您的指示去做。
-x
跳过不同文件系统上的目录,但它会对命令行上的每一个非选项参数执行此操作。
当你跑步时du -x -sh /*
,你是在告诉du
你要给你详细信息全部中的文件和目录/
,无论它们是否是其他文件系统的挂载点。
du
不接收单个参数/*
,它获取扩展为的所有路径名/*
。外壳扩展/*
为全部匹配的文件/目录/sockets/fifos/etc 名称/
并将它们传递给du
(实际上除了以.
“隐藏”文件名开头的文件名之外的所有名称 - 除非dotglob
设置了 shell 选项)。查看man bash
并搜索Pathname Expansion
.
您可能想要做的是使用 的du
(-d
又名--max-depth
)选项。例如
# du -h -x -d 1 /
512 /media
8.7M /var
512 /srv
1.4G /opt
10K /tmp
512 /mnt
512 /boot
1.1M /etc
13K /run
512 /home
97M /usr
1.5G /
请注意其他文件系统(例如 /proc)如何从输出中排除 - 这是因为虽然它们匹配-d 1
最大深度,但它们也是与其自身分离的文件系统/
,因此-x
排除它们并且du
永远不会下降到这些安装点。
注意:-d
是 的非标准(即非 POSIX)选项du
。然而,它在 GNU 和 *BSD 版本中都可用du
,并且可能还有许多其他版本。也就是说,这肯定可以在 Linux 和 FreeBSD 上运行,并且几乎可以肯定在其他现代的类 UNIX 系统上运行,但可能无法在古老的或专有的 UNIX 上运行。
您的问题 () 中的手册页摘录-x, --one-file-system skip directories on different file systems
表明您正在使用du
GNU的 GNU 版本coreutils
。