25

I would like to see sizes of subfolders in a folder, similar to linux du -sh command. How can I list directories and their sizes in command prompt?

Oliver Salzburg
  • 89,072
  • 65
  • 269
  • 311
giorgio79
  • 1,149

3 Answers3

34

Try the Disk Usage utility from Sysinternals. Specifically, du -l 1 should show the size of each subdirectory of the current directory. For more information, run du without any parameters.


If PowerShell is OK, then try the following:

Get-ChildItem |
Where-Object { $_.PSIsContainer } |
ForEach-Object {
  $_.Name + ": " + (
    Get-ChildItem $_ -Recurse |
    Measure-Object Length -Sum -ErrorAction SilentlyContinue
  ).Sum
}

The sizes are in bytes. To format them in some larger unit like MB, try the following (condensed to one line):

Get-ChildItem | Where-Object { $_.PSIsContainer } | ForEach-Object { $_.Name + ": " + "{0:N2}" -f ((Get-ChildItem $_ -Recurse | Measure-Object Length -Sum -ErrorAction SilentlyContinue).Sum / 1MB) + " MB" }

For more information, see this article at Technet.

If you want more flexible formatting of the sizes (choosing kB/MB/GB/etc based on the actual size), see this question and its answers.


I don't think it's possible to do what you want from the regular command line and with only a few simple commands. See this script as an example (not going to copy it here because I don't believe that approach is worth pursuing, unless PowerShell isn't available and third-party utilities aren't acceptable).

Indrek
  • 24,874
0

This is a modification to Indrek's answer. I added the followings:

  • made it recursive to go further in subdirectories
  • added a size threshold to omit samller directories
  • replaced directory names with their relative path from current directory
  • sorted results by their path (I found it more convinient rather than sorting them by size, when they are already filtered by size)
  • added some formatting to make the results more readable

So, set $minsizeMB and $maxdepth with the desired values and run the script.

$minsizeMB = 100; 
$maxdepth = 5; 
Get-ChildItem -depth $maxdepth -Recurse |
    Where-Object { $_.PSIsContainer } |
    Select-Object FullName | 
    Sort-Object FullName |
    ForEach-Object { 
        $directory = Get-Item $_.FullName;
        $path = Resolve-Path -Relative $directory.FullName ; 
        $size = ((Get-ChildItem $directory -Recurse | Measure-Object Length -Sum -ErrorAction SilentlyContinue).Sum / 1MB) ; 
        if ($size -ge $minsizeMB) { "{0,-90}: {1:N2} MB" -f ($path, $size) } 
    }
saastn
  • 85
0

I have no experience with du in Linux. But in windows I use dir /s to list all folders and subfolders along with file sizes.

Ankit
  • 4,866