在 timeshift 文件夹上运行 du 会产生不同的结果

在 timeshift 文件夹上运行 du 会产生不同的结果

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)。

相关内容