如何检查具有许多硬链接的 NTFS 目录中实际使用的大小?

如何检查具有许多硬链接的 NTFS 目录中实际使用的大小?

在 Win7 NTFS 卷上,我使用正确支持 --link-dest 的 cwrsync 来创建“快照”类型的备份。所以我有:

z:\backups\2010-11-28\cygdrive\c\Users\...
z:\backups\2010-12-02\cygdrive\c\Users\...

2010-12-02 的内容主要是指向 2010-11-28 目录中文件的硬链接,但只有 2010-12-02 中有一些新文件或更改的文件。在 Linux 上,“du”实用程序将告诉我每个增量快照的实际大小。在 Windows 上,cygwin 下的 explorer 和 du 都被硬链接欺骗,显示 2010-12-02 占用的空间比 2010-11-28 多一点。

是否有一个 Windows 实用程序可以显示实际使用的正确空间?

答案1

尝试使用Sysinternals 磁盘使用情况(也称为du),具体使用-u-v标志将只计算唯一的出现次数,并将显示每个文件夹的使用情况。

据我所知,文件系统不会显示原始文件和硬链接之间的差异(这实际上是硬链接的要点),因此您不能逐个文件夹地忽略它们,而需要进行比较。

为了测试,我创建了一个包含 6 个文件的随机文件夹。克隆了所有内容。然后在第一个文件夹中创建了几个硬链接和软链接,以引用第一个文件夹中的其他文件以及第二个文件夹中的一些文件。

运行du -u -v testFld结果(注意文件夹旁边的值以 KiB 为单位):

       104  <path>\testFld\A
        54  <path>\testFld\B
       149  <path>\testFld

Totals:
Files:        12
Directories:  2
Size:         162,794 bytes
Size on disk: 162,794 bytes

运行du -u -v testFld\a结果:

104  <path>\testFld\a
...

运行du -u -v testFld\b结果:

74   <path>\testFld\b
...

注意到不匹配了吗?
A 中引用 B 中文件的符号链接仅在“完整”运行期间计入 A,而 B 仅返回 54(即使这些文件最初位于 B 中并且从 A 硬链接)。当您单独测量 B 时(或者,如果您不使用唯一标志-u),它将计入其“完整”测量值 74。

答案2

PowerShell 5 可能是一个选项。它适用于 Windows 7,但我只在 Server 2012 R2 上测试过,2015 年 4 月预览

PowerShell 5 中的文件系统提供程序具有两个新属性LinkTypeTarget

ls taskmgr.exe | fl LinkType,Target

返回:

LinkType : HardLink
Target   : C:\Windows\WinSxS\amd64_microsoft-windows-advancedtaskmanager_..._6.3.9600.17..2\Taskmgr.exe

所以现在我只能显示 system32 中所有不是硬链接的文件:

cd $env:SystemRoot\System32
ls -Recurse -File -force -ErrorAction SilentlyContinue | ? LinkType -ne HardLink | Measure-Object -Property Length -Sum

返回:

Count    : 844
Sum      : 502,486,831

您可以将其与所有文件进行比较:

ls -Recurse -File -force -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum

Count    : 14092
Sum      : 2,538,256,262

因此,超过 13,000 个大小超过 2GB 的文件是硬链接

答案3

您可以使用执行程序显示目录树的“真实大小”:

ln.exe --truesize z:\backups\.

它将只检测起始文件夹下方的硬链接。

答案4

我也对这个问题做了一些研究。以下是我发现的结果。

NTFS 中包含硬链接文件的文件夹大小可以从三种不同的含义来考虑:

  1. 大小包括所有硬链接文件的大小(由 WE 显示)。
  2. 仅就当前文件夹而言的唯一文件的大小。
  3. 仅就整个磁盘而言唯一文件的大小。

如果启用了“跟踪 NTFS 硬链接”选项,则 TreeSize Professional 在“详细信息”选项卡的“已分配”列中显示数字 2。

下面是 winsxs 文件夹的示例 (10 对应 7.5Gb):

图像

获得 3 号值对我来说仍然是个问题。尽管我能够通过使用带有 NL_Info 插件的 Total Commander 获得下限。我得到的是只有一个硬链接(唯一文件)的文件占用的大小。对于给定的示例,它大约为 5Gb。

因此尝试扩展 harrymc 的回答或换句话说。

相关内容