df, du 报告不正确的磁盘使用情况

Ste*_*rds 5 disk-usage

df并且du都错误地报告我的根分区,一个100GB的SSD,没有剩余空间并且分别使用了100G;/home/steven单独85G 。du然而,提供的磁盘使用情况的简单总和报告不到 13G 使用。

我怎样才能解决这个问题?

具体来说:

~ » du -sh ~
85G   /home/steven

~ » du -b ~ | wc -l
15041

~ » du -h ~ | sort -h | tail -n 1
85G   /home/steven # 91088489808 bytes if using -b for du

~ » du -b ~ | sort -n | head -n 15040 | cut -f 1 | perl -ne 'BEGIN{$i=0;}$i+=$_;END{print $i.qq|\n|;}'
12735983847 # 11-12G, roughly
Run Code Online (Sandbox Code Playgroud)

显然,85G 和 11G 或 12G 之间存在巨大差异。我运行lsof +L1并消除了所有带有标记为 的文件的进程deleted,但仍然没有运气。

我有几个$HOME指向repos外部硬盘驱动器上的目录(例如)的软链接,根据我阅读的一些 Stack Exchange 帖子,这可能是一个问题,但我似乎无法理解。

我接下来该怎么做?

Mar*_*ick 4

du对给定的树进行深度优先遍历。默认情况下,它显示每个目录树的使用情况,显示每个目录树的包含磁盘使用情况:

$ du ~
4      /home/bob/Videos
40     /home/bob/.cache/abrt
43284  /home/bob/.cache/mozilla/firefox
43288  /home/bob/.cache/mozilla
12     /home/bob/.cache/imsettings
48340  /home/bob/.cache
4      /home/bob/Documents
48348  /home/bob
Run Code Online (Sandbox Code Playgroud)

如果给定-a选项,它将另外显示每个文件的大小。

使用该-s选项,它将仅显示每个参数文件或目录树的总大小。

$ du -s ~
48348  /home/bob
$ du -s ~/*
4      /home/bob/Videos
4      /home/bob/Documents
Run Code Online (Sandbox Code Playgroud)

所以,当你跑步时

$ du -b ~ | wc -l
15041

$ du -b ~ | sort -n | head -n 15040 | cut -f 1 | \
    perl -ne 'BEGIN{$i=0;$i+=$_;END{print $i.qq|\n|;}'
12735983847
Run Code Online (Sandbox Code Playgroud)

您正在总结主目录下所有内容的大小 - 不幸的是,多次,因为每行报告的大小都包含所有子目录 - 但因为您省略了 du 输出的最后一行,这将是 的行/home/stevendu 没有不要计算主目录顶层中任何常规文件的大小。所以这个总和不包括你的非常大的.xsession-errors文件。

当你跑的时候

du -sb ~ returns 91296460205, but the sum of du -sb ~/* is only 1690166532
Run Code Online (Sandbox Code Playgroud)

您的du -sb ~/*输出不包含主目录中以..

du ~ | tail -1du -s ~应该合理地显示主目录的磁盘使用情况(当然不包括已删除但打开的文件),但是如果您想在不依赖 的情况下汇总所有文件大小du,您可以执行以下操作(假设现代find支持以printf %s字节为单位显示大小的格式):

find ~ -type f -printf '%s\n' | perl -ne 'BEGIN{$i=0;$i+=$_;END{print $i.qq|\n|;}'
Run Code Online (Sandbox Code Playgroud)