web-dev-qa-db-ja.com

du.exe(Sysinternals)を使用すると、特定のサイズを超えるフォルダを表示できますか?

du.exeを使用すると、大量のスペースを占めるフォルダを再帰的に識別できます。たとえば、次は、3レベルの深さc:\からのすべてのフォルダのサイズを示します。

du.exe -l 3 c:\

この出力をフィルタリングして、1 GBを超えるフォルダのみを表示するにはどうすればよいですか?

参考のためにdu.exeからの出力の抜粋を以下に示します。

Du v1.4 - report directory disk usage
Copyright (C) 2005-2011 Mark Russinovich
Sysinternals - www.sysinternals.com

   6,344,864  c:\Windows\winsxs
  18,268,671  c:\Windows
 483,343,308  c:\
Files:        412125
Directories:  42072
Size:         494,943,548,281 bytes
Size on disk: 487,560,269,896 bytes
6
Iain

私は以前のdu/powershellコンボで新しいバリアントを提供しています。どちらもdu v1.61で私のために機能しなかったからで、他の人は同じことに直面するかもしれません問題。以前の亜種でいくつかの問題に遭遇しました:

  1. du-nobannerスイッチを含める必要があります(含めなかった)ため、上部のバナーがConvertFrom-Csvで詰まることはありません(私にとっては、不思議な目に見えない出力として現れます)。
  2. それでも、Powershellは、たとえばCannot convert value "40822284152" to type "System.Int32". Error: "Value was either too large or too small for an Int32."一部の行。おそらく非常に大きなディレクトリ。
  3. 最後に、Where-Object { [int]$_.DirectorySize -gt 1048576 }が存在するにもかかわらず、出力には1GBをはるかに下回る非常に小さなディレクトリが含まれます

私はPowershellのエキスパートではありませんが、前の2つのバリアントをなんとかして、実用的なソリューションを提供することができました。

du -nobanner -c -l 3 \ | ConvertFrom-Csv | select Path,@{Name="DirectorySize";expression={$_.DirectorySize / 1GB }} | Where-Object { $_.DirectorySize -gt 1 } | Sort-Object { $_.DirectorySize } -descending

そしてちょっとした笑いのために、正規表現でdufindstrを使用した、柔軟性が低く/精度が低いソリューションを次に示します。

du -l 3 \ | findstr /R /C:",[0-9][0-9][0-9],[0-9][0-9][0-9]  "

これは、1GB上のディレクトリが印刷されるパターンを利用しています。具体的には、3桁の前に追加の先行コンマがあり、その後にさらに3桁続くコンマがあります。末尾に印刷される合計を除外するには、後続の2つのスペースが必要です。注:このソリューションは、Powershellソリューションのようにディレクトリサイズで並べ替えることはしません。

2
Jimadine

他の答えが言うように、du.exeだけでそれを行うことはできません。 PowerShellで救出!

.\du.exe -c -l 3 C:\ | ConvertFrom-Csv -Header Size,Path | Where-Object { [int]$_.Size -gt 1048576 } | Sort-Object { [int]$_.Size } -descending

説明

その長いコマンドを、それぞれ次のビットにパイプされる個々のビットに分解します。

.\du.exe -c -l 3 C:\

-cパラメータがduに出力をCSVとしてフォーマットするように指示することを除いて、これは基本的にはあなたが始めたものです。

ConvertFrom-Csv -Header Size,Path

これにより、CSV出力がduから取得され、PowerShellハッシュテーブルに変換されます。 duは列名のヘッダーを提供しないため、手動で行う必要があります。

Where-Object { [int]$_.Size -gt 1048576 }

これにより、データがフィルター処理され、サイズが1 GBを超える行のみが返されます(duはサイズをKBで返し、1 GB = 1048576 KB)。数値データを処理していることをPowerShellに知らせるために、[int]の部分に注意してください。

Sort-Object { [int]$_.Size } -descending

これにより、サイズでデータが降順でソートされます(ここでも、ソートするデータが数値であることを指定しています)。もちろん、これはオプションです。

8
Indrek

最新のdu.exeバージョンでは、Powershell ConvertFrom-Csvを使用してヘッダーを追加しても、そのままでは機能しません。du.exeがリストに独自のヘッダーを追加するためです。必要なのは、selectコマンドで既存のヘッダーを選択することです。

du.exe -c -l 3 C:\ | ConvertFrom-Csv | select Path,DirectorySize | Where-Object { [int]$_.DirectorySize -gt 1048576 }
4
Simon Katanski

そのオプションはDU 1.4では使用できません

使用法:du [-c] [-l(レベル)| -n | -v] [-u] [-q](ディレクトリ)

-c出力をCSVとして出力します。

-lサブディレクトリの情報の深さを指定します(デフォルトはすべてのレベルです)。

-n再帰しません。

-qクワイエット(バナーなし)。

-uハードリンクされたファイルの各インスタンスをカウントします。

-v中間ディレクトリのサイズ(KB)を表示します。

したがって、DUを使用するだけでは、出力を特定のサイズのものに制限できません。

1
Bon Gart