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


14

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

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上,explorer和cygwin下的du都被硬链接欺骗,并显示2010-12-02占用的空间比2010-11-28多一点。

是否有Windows实用程序将显示正确使用的正确空间?



对于正常的磁盘使用情况,这似乎是解因性的问题和答案:如何在Windows上可视化文件系统的使用情况?
马特·威尔基

Answers:


11

尝试使用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时(或者,如果不使用-uunique标志),它将计算其“满”测量值74。


1
谢谢,我不知道sysinternals du,只是关于Cygwin。显然,cygwin du也可以实现我想要的功能,我只是没有想到在开始赏金之前可以尝试一下。
kbyrd 2010年

这个答案混淆了-u标志的功能。你得到了“充分”的措施,如果你使用-u标志。没有它,它将仅计算任何硬链接文件的1个实例。在docs.microsoft.com/en-gb/sysinternals/downloads/du中说,并通过测试对其进行验证。
martixy

2

可以选择使用PowerShell 5。它适用于Windows 7,但我仅在2015年4月预览版的Server 2012 R2上进行了测试

PowerShell 5中的文件系统提供程序具有两个新属性,LinkType并且Target

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以上的文件是硬链接


1

TreeSize Professional(约$ 55,30天试用期)声称会占用NTFS硬链接磁盘空间。快速试用似乎可以证明这一点。

开箱即用的硬链接支持未打开:转到“ 工具”>“选项”>“扫描”,然后重新扫描,然后使用Ctrl-1Ctrl-2大小和已分配空间之间切换。分配的是实际使用的空间,而大小是其他程序通常报告的统计信息。

启用硬链接支持(如果需要也可以进行符号链接和安装)会降低性能。调色板适合我的口味,但这似乎与该类型的课程相当。在方框图区域中单击时也要小心-当您只打算扩展文件夹时,很容易因误拖放而意外移动文件夹。


1

我认为一些事实需要在这里设定。

Windows无法“检测”硬链接,因为每个文件实际上都是到磁盘上一堆字节的硬链接。

杜工具检测到重复,但是那是假的太多,因为如果文件夹中包含的文件和B仅包含硬链接到一个文件,然后杜A的杜B的将返回相同的答案-文件的大小来原本来自A,但这些文件现在也位于B中。

这实际上是正确的,因为例如,如果您删除了A,则其文件将不会在磁盘上删除,因为它们仍被B引用。对于硬链接,哪个文件是源文件,哪个文件是硬链接是相当武断,毫无意义。

诸如du之类的产品将在打折重复的同时列出目录。仅当所有文件和硬链接都包含在一个目录中时,这才起作用。许多文件夹列表产品都可以这样做。

结论:通过硬链接,“在NTFS目录中使用的实际大小”问题毫无意义。


1

我也对此问题进行了一些研究。这是我发现的结果。

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

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

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

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

图片

接收3号值仍然是我的问题。虽然我可以通过将Total Commander与NL_Info插件结合使用来获得下限。我得到的是只有一个硬链接的文件(唯一的文件)占用的大小。对于给定的示例,大约为5Gb。

因此,尝试扩大harrymc的答案或换句话说。


0

您可以使用ln.exe来显示目录树的“真实大小”:

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

它只会检测该起始文件夹下的硬链接。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.