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 帖子,这可能是一个问题,但我似乎无法理解。
我接下来该怎么做?
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/steven
,du
没有不要计算主目录顶层中任何常规文件的大小。所以这个总和不包括你的非常大的.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 -1
都du -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)