df
两者du
都错误地报告我的根分区(100GB SSD)没有剩余空间并分别使用了 100G;单独85G /home/steven
。然而,对 提供的磁盘使用情况进行简单求和后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
显然,85G 与 11G 或 12G 之间存在巨大差异。我运行lsof +L1
并消除了所有带有标记文件的进程deleted
,但仍然没有运气。
我有几个软链接指向外部硬盘驱动器上$HOME
的目录(例如,repos
),这可能是基于我读过的一些 Stack Exchange 帖子的问题,但我似乎无法理解它。
接下来我应该做什么?
答案1
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
如果给定-a
选项,它将另外显示每个文件的大小。
使用该-s
选项,它将仅显示每个参数文件或目录树的总大小。
$ du -s ~
48348 /home/bob
$ du -s ~/*
4 /home/bob/Videos
4 /home/bob/Documents
所以,当你跑步时
$ 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
您正在总结主目录下所有内容的大小 - 不幸的是,多次总结,因为每行报告的大小都包含所有子目录 - 但因为您省略了 du 输出的最后一行,这将是/home/steven
,du
没有计算主目录顶层中任何常规文件的大小。所以这个总和不包括你的非常大的.xsession-errors
文件。
当你跑的时候
du -sb ~ returns 91296460205, but the sum of du -sb ~/* is only 1690166532
您的du -sb ~/*
输出不包含主目录中以.
.
du ~ | tail -1
和都du -s ~
应该合理地显示主目录的磁盘使用情况(当然不包括已删除但打开的文件),但是如果您想在不依赖 的情况下汇总所有文件大小du
,您可以执行以下操作(假设现代find
支持printf %s
以字节为单位显示大小的格式):
find ~ -type f -printf '%s\n' | perl -ne 'BEGIN{$i=0;$i+=$_;END{print $i.qq|\n|;}'
答案2
您正在对字节求和,但文件系统的块大小可能远大于 1 字节。为了获得准确的计数,您应该将每个文件的大小向上舍入,使其成为文件系统块大小的倍数。
安装 GNU coreutils 后,您可以运行stat --file-system $HOME
来查找文件系统的块大小。
平均而言,文件会浪费半个块。将半个块乘以 $HOME 中的文件数量,看看结果是否接近 70GiB。如果是这样,那么你的谜团就解开了。