snapshot
我的目标是从备份工具中找出哪些文件/文件夹占用了最多的空间timeshift
,但使用du
它时会产生不同的结果:
# du -hs *
18G 2018-09-21_16-14-57
910M 2018-10-06_07-04-27
仅限第二个文件夹
# du -hs 2018-10-06_07-04-27
18G 2018-10-06_07-04-27
我想要的结果是 910M,然后我想深入研究以找出哪些文件夹/文件占用了最多的空间。
为什么会du
给出不同的结果?我如何深入研究 910M 的结果?
我知道第二个文件夹中充满了硬链接(这就是该工具的工作方式),但du
不应该报告不同的大小,因为*
只是扩展到实际文件夹名称bash
,不是吗?
更新:我刚刚尝试过,# du -hd 2 *
这似乎是朝着正确方向迈出的一步,但当有 20 个或更多快照文件夹而我只想深入研究其中一个时,这不是一个合理的解决方案。
答案1
du
不应该报告不同的大小,因为*
在 Bash 中它只是扩展为实际的文件夹名称,不是吗?
它应该,它仍然只是一个du
过程并且它正在尝试变得智能。
理由:如果du *
不智能,就很难让它变得智能。反过来很容易,让智能变得du
“愚蠢”很简单。如果您想要完全独立的结果,那么只需du
对两个目录分别运行 -s 即可。
调用单独 -s 的几个一般示例du
:
for d in *; do du -hs "$d"; done
find . -exec du -hs {} \;
它们在细节上确实有所不同。find
基于 的版本可以自定义(例如以 开头find . -type d …
)。
另外,请检查--apparent-size
选项是否du
支持。
du
因为您想要“找出哪些文件/文件夹占用了最多的空间”,所以“变得愚蠢”是否对您有用是另一个问题。另一个答案是对的:
如果文件夹中的文件对应于具有多个链接的 inode,则在该文件夹中删除它们不会改变任何内容。
的智能行为du
似乎比(强制的)“愚蠢”行为更能满足您的需求。我的建议是利用它,事实会du
按给定的顺序处理其参数。这意味着报告的最后一个物体du
是您删除此对象且仅删除此对象时将获得的结果(除非它包含指向此特定对象未窥视的另一个位置的硬链接)。
在您的示例中,扩展的命令显然是:
du -hs 2018-09-21_16-14-57 2018-10-06_07-04-27
结果表明,910M
如果你删除 ,你将得到2018-10-06_07-04-27
。现在尝试另一个序列:
du -hs 2018-10-06_07-04-27 2018-09-21_16-14-57
输出的最后一行将告诉您如果2018-09-21_16-14-57
仅删除将获得多少空间。
如果我是你,我也会调查ncdu
(交互式工具)及其行为。
答案2
显然du
会忽略它已在访问的其他目录中占用的 inode。例如您的示例:
du -hs 2018-09-21_16-14-57 2018-10-06_07-04-27
du -hs 2018-10-06_07-04-27 2018-09-21_16-14-57
会产生不同的结果。
但就你的情况而言,这应该没什么区别。如果文件夹中的文件对应于具有多个链接的 inode,则删除该文件夹中的文件不会改变任何内容。恕我直言,你应该关注 inode 而不是目录(这意味着不要使用-s
中的参数du
)。