web-dev-qa-db-ja.com

多くのハードリンクがある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の下のduの両方がハードリンクにだまされ、2010-12-02が2010-11-28よりも少し多くのスペースを占めていることを示しています。

実際に使用されている正しいスペースを表示するWindowsユーティリティはありますか?

14
kbyrd

Sysinternals Disk Usage (別名du)を使用してみてください。具体的には、-uフラグと-vフラグを使用すると、一意のオカレンスのみがカウントされ、使用状況が表示されます。それが進むにつれて、各フォルダの。

私の知る限り、ファイルシステムは元のファイルとハードリンク(実際にはハードリンクのポイント)の違いを示さないため、フォルダーごとに割引することはできませんが、これを比較的行う必要があります。

テストするために、6つのファイルを含むランダムなフォルダーを作成しました。全部クローンしました。次に、最初のフォルダー内にいくつかのハードリンクとソフトリンクを作成して、最初のフォルダー内の他のファイルと2番目のフォルダー内の他のファイルを参照します。

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
...

不一致に気づきましたか?
Bのファイルを参照するAのシンボリックリンクは、「フル」実行中にのみAに対してカウントされ、Bは54のみを返します(ファイルが元々Bにあり、Aからハードリンクされていたとしても)。 Bを個別に測定する場合(または、-u一意のフラグを使用しない場合)、Bは74の「完全な」測定値をカウントします。

11
DMA57361

PowerShell5はオプションかもしれません。これはWindows7で利用できますが、これはServer 2012 R2でのみテストしました 2015年4月プレビュー

PowerShell 5のファイルシステムプロバイダーには、2つの新しいプロパティ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

したがって、2GB以上の13,000を超えるファイルはハードリンクです

2
Peter Hahndorf

私もこの質問についていくつかの調査をします。これが私が発見した結果です。

NTFSでハードリンクされたファイルを含むフォルダサイズは、次の3つの異なる意味で考えることができます。

  1. すべてのハードリンクされたファイルのサイズを含むサイズ(WEによって表示されます)。
  2. 現在のフォルダのみに関する一意のファイルのサイズ。
  3. ディスク全体でのみ一意のファイルのサイズ。

番号2は、[NTFSハードリンクの追跡]オプションが有効になっている場合に、TreeSizeProfessionalの[詳細]タブの[割り当て済み]列に表示されるものです。

これがwinsxsフォルダーの例です(10の反対に7.5Gb):

image

3番目の値を受け取ることはまだ私にとっての質問です。 TotalCommanderとNL_Infoプラグインを使用して下限を取得することはできましたが。私が持っているのは、ハードリンクが1つしかないファイル(一意のファイル)が占めるサイズです。与えられた例では約5Gbでした。

つまり、harrymcの答えを拡張しようとすると、言い換えれば言います。

1
tschesseket

ここにいくつかの事実を設定する必要があると思います。

すべてのファイルは実際にはディスク上のバイトの束へのハードリンクであるため、Windowsはハードリンクを「検出」できません。

Duツールは重複を検出しますが、これも誤りです。フォルダーAにファイルが含まれ、BにA内のファイルへのハードリンクのみが含まれている場合、du of A and du ofBは同じ答えを返します-元々Aから来たファイルのサイズですが、これらのファイルも現在Bにあります。

これは実際には正しいです。たとえば、Aを削除した場合、そのファイルはBによって参照されているため、ディスク上で削除されません。ハードリンクの場合、どのファイルがソースで、どのファイルがハードリンクであるかかなり恣意的で無意味です。

Duなどの製品は、重複を割り引いてディレクトリを一覧表示します。これは、すべてのファイルとハードリンクが1つのディレクトリに含まれている場合にのみ機能します。多くのフォルダリスト製品がそれを行います。

結論:ハードリンクでは、「NTFSディレクトリで使用される実際のサイズ」の質問は無意味です。

1
harrymc

TreeSize Professional (〜$ 55、30日間の試用版)は、NTFSハードリンクディスク領域を区別すると主張しています。簡単な試用はこれを裏付けるようです。

ハードリンクのサポートはそのままではオンになりません:ツール>オプション>スキャンに移動し、再スキャンしてから、Ctrl-1Ctrl-2を使用してサイズおよび割り当てられたスペース。 Allocatedは実際に使用されるスペースであり、Sizeは通常によって報告される統計です他のプログラム。

ハードリンクのサポートをオンにすると、パフォーマンスが低下します(必要に応じて、シンボリックリンクとマウントも)。カラーパレットは私の好みには派手ですが、それはこのジャンルのコースと同等のようです。また、ボックスチャート領域をクリックするときは注意してください。フォルダを展開するだけの場合に、誤ってドラッグアンドドロップでフォルダを移動してしまう可能性があります。

1
matt wilkie

ln.exe を使用して、ディレクトリツリーの「実際のサイズ」を表示できます。

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

その開始フォルダの下のハードリンクのみを検出します。

0
Limer