web-dev-qa-db-ja.com

PowerShellでdu?

PowerShellを使用して d -ish分析を取得するにはどうすればよいですか?ディスク上のディレクトリのサイズを定期的にチェックしたいのですが。

以下に、現在のディレクトリ内の各ファイルのサイズを示します。

foreach ($o in gci)
{
   Write-output $o.Length
}

しかし、私が本当に必要としているのは、サブディレクトリを含む、ディレクトリ内のすべてのファイルの合計サイズです。また、オプションでサイズで並べ替えることができるようにしたいと思います。

23
Cheeso

「ExploringBeautifulLanguages」ブログで利用可能な実装があります。

"Powershellでの 'du -s *'の実装"

function directory-summary($dir=".") { 
  get-childitem $dir | 
    % { $f = $_ ; 
        get-childitem -r $_.FullName | 
           measure-object -property length -sum | 
             select @{Name="Name";Expression={$f}},Sum}
}

(ブログ所有者によるコード:Luis Diego Fallas)

出力:

 PS C:\ Python25>ディレクトリ-概要
 
名前の合計
 ---- --- 
 DLL 4794012 
 Doc 4160038 
 include 382592 
 Lib 13752327 
 libs 948600 
 tcl 3248808 
 Tools 547784 
 LICENSE.txt 13817 
 NEWS.txt 88573 
 python.exe 24064 
 pythonw.exe 24576 
 README.txt 56691 
 w9xpopen.exe 4608 
28
Tomalak

回答のコマンドを少し変更して、サイズの降順で並べ替え、サイズをMB単位で含めました。

gci . | 
  %{$f=$_; gci -r $_.FullName | 
    measure-object -property length -sum |
    select  @{Name="Name"; Expression={$f}}, 
            @{Name="Sum (MB)"; 
            Expression={"{0:N3}" -f ($_.sum / 1MB) }}, Sum } |
  sort Sum -desc |
  format-table -Property Name,"Sum (MB)", Sum -autosize

出力:

PS C:\scripts> du

Name                                 Sum (MB)       Sum
----                                 --------       ---
results                              101.297  106217913
SysinternalsSuite                    56.081    58805079
ALUC                                 25.473    26710018
dir                                  11.812    12385690
dir2                                 3.168      3322298

おそらくそれは最も効率的な方法ではありませんが、機能します。

20
hollie317704
function Get-DiskUsage ([string]$path=".") {
    $groupedList = Get-ChildItem -Recurse -File $path | Group-Object directoryName | select name,@{name='length'; expression={($_.group | Measure-Object -sum length).sum } }
    foreach ($dn in $groupedList) {
        New-Object psobject -Property @{ directoryName=$dn.name; length=($groupedList | where { $_.name -like "$($dn.name)*" } | Measure-Object -Sum length).sum }
    }
}

私のは少し違います。すべてのファイルをdirectorynameでグループ化し、そのリストを調べて、各ディレクトリの合計を作成します(サブディレクトリを含めるため)。

1
Damien Gregory