Obter tamanho da pasta na linha de comando do Windows

128

É possível no Windows obter o tamanho de uma pasta na linha de comando sem usar nenhuma ferramenta de terceiros?

Eu quero o mesmo resultado que você obteria ao clicar com o botão direito do mouse na pasta nas propriedades do Windows Explorer →.

Eldad Assis
fonte

Respostas:

120

Você pode adicionar tamanhos de forma recursiva (a seguir, um arquivo em lotes):

@echo off
set size=0
for /r %%x in (folder\*) do set /a size+=%%~zx
echo %size% Bytes

No entanto, isso tem vários problemas porque cmdé limitado à aritmética de número inteiro assinado de 32 bits. Portanto, obterá tamanhos acima de 2 GiB incorretos 1 . Além disso, provavelmente contará links simbólicos e junções várias vezes, portanto, na melhor das hipóteses, é um limite superior, não o tamanho real (você terá esse problema com qualquer ferramenta).

Uma alternativa é o PowerShell:

Get-ChildItem -Recurse | Measure-Object -Sum Length

ou mais curto:

ls -r | measure -sum Length

Se você quiser mais bonito:

switch((ls -r|measure -sum Length).Sum) {
  {$_ -gt 1GB} {
    '{0:0.0} GiB' -f ($_/1GB)
    break
  }
  {$_ -gt 1MB} {
    '{0:0.0} MiB' -f ($_/1MB)
    break
  }
  {$_ -gt 1KB} {
    '{0:0.0} KiB' -f ($_/1KB)
    break
  }
  default { "$_ bytes" }
}

Você pode usar isso diretamente em cmd:

powershell -noprofile -command "ls -r|measure -sum Length"

1 Eu tenho uma biblioteca bignum parcialmente finalizada em arquivos em lote em algum lugar que, pelo menos, acerta a adição inteira de precisão arbitrária. Eu realmente deveria liberá-lo, eu acho :-)

Joey
fonte
+1 Eu estava apenas vagando na saída de obter ajuda * para encontrar algo assim.
10263 Steve
2
Steve, aos meus olhos, o PowerShell é muito mais Unix-y que Unix, pois a maioria dos comandos principais é realmente ortogonal. No Unix dufornece o tamanho do diretório, mas tudo o que está fazendo é andar na árvore e resumir. Algo que pode ser muito elegantemente expresso em um pipeline como aqui :-). Portanto, para o PowerShell, costumo procurar como decompor a meta de alto nível em operações adequadas de nível inferior.
Joey
3
Entendo, parece ignorar pastas ocultas dessa maneira. ls -force -r funciona se eu também quiser incluir pastas ocultas.
garg
2
folder\*não está funcionando para mim o tamanho da pasta que eu coloquei no local mostra 0 bytes, existe alguma solução?
TI pesquisador
2
Uma versão um pouco melhor: powershell -noprofile -comand "'{0: N0}' -f (ls -r | measure -s Length) .Sum"
zumalifeguard
120

Há uma ferramenta interna do Windows para isso:

dir /s 'FolderName'

Isso imprimirá muitas informações desnecessárias, mas o final será o tamanho da pasta assim:

 Total Files Listed:
       12468 File(s)    182,236,556 bytes

Se você precisar incluir pastas ocultas, adicione /a.

Nir Duan
fonte
7
Esta é a solução mais elegante se você não precisar de um valor de retorno inteiro. Nota: a opção '/ a' incluirá arquivos ocultos e do sistema no tamanho total.
Oran D. Senhor
1
Acho que não é possível imprimir tamanhos de arquivo em algumas unidades mais úteis, como kB ou MB, certo?
David Ferenczy Rogožan
Aspas duplas em vez de aspas simples.
user2924019
66

Sugiro baixar o utilitário DU do Sysinternals Suite, fornecido pela Microsoft neste link http://technet.microsoft.com/en-us/sysinternals/bb896651

usage: du [-c] [-l <levels> | -n | -v] [-u] [-q] <directory>
   -c     Print output as CSV.
   -l     Specify subdirectory depth of information (default is all levels).
   -n     Do not recurse.
   -q     Quiet (no banner).
   -u     Count each instance of a hardlinked file.
   -v     Show size (in KB) of intermediate directories.


C:\SysInternals>du -n d:\temp

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

Files:        26
Directories:  14
Size:         28.873.005 bytes
Size on disk: 29.024.256 bytes

Enquanto você está nisso, dê uma olhada nos outros utilitários. Eles economizam a vida de todos os profissionais do Windows

Steve
fonte
11
Isso dificilmente "sem nenhuma ferramenta de terceiros", eu acho.
Joey
11
Ah, certo, mas achava que a família não deveria ser considerada 'terceirizada'.
10263 Steve
1
Bem, é verdade, mas ainda é um download adicional (ou usando, \\live.sysinternals.comse ainda existir). No entanto, concordo plenamente que todas as ferramentas sysinternals devem ser incluídas por padrão. Embora para muitos usos, o PowerShell seja um substituto bastante digno.
Joey
1
Alguém disse Powershell? Tente o seguinte: "{0: N2}" -f ((Get-ChildItem C: \ Temp -Recurse | Medida-Objeto-Comprimento da Propriedade -Soma) .Soma / 1MB) + "MB"
John Homer
3
Sugiro a todos que baixem o que Mark Russinovich desenvolver :) Continuo vendo esse nome sempre que encontro uma ferramenta que salva minha vida.
dkellner
46

Oneliner:

powershell -command "$fso = new-object -com Scripting.FileSystemObject; gci -Directory | select @{l='Size'; e={$fso.GetFolder($_.FullName).Size}},FullName | sort Size -Descending | ft @{l='Size [MB]'; e={'{0:N2}    ' -f ($_.Size / 1MB)}},FullName"

O mesmo, mas apenas o PowerShell:

$fso = new-object -com Scripting.FileSystemObject
gci -Directory `
  | select @{l='Size'; e={$fso.GetFolder($_.FullName).Size}},FullName `
  | sort Size -Descending `
  | ft @{l='Size [MB]'; e={'{0:N2}    ' -f ($_.Size / 1MB)}},FullName

Isso deve produzir o seguinte resultado:

Size [MB]  FullName
---------  --------
580,08     C:\my\Tools\mongo
434,65     C:\my\Tools\Cmder
421,64     C:\my\Tools\mingw64
247,10     C:\my\Tools\dotnet-rc4
218,12     C:\my\Tools\ResharperCLT
200,44     C:\my\Tools\git
156,07     C:\my\Tools\dotnet
140,67     C:\my\Tools\vscode
97,33      C:\my\Tools\apache-jmeter-3.1
54,39      C:\my\Tools\mongoadmin
47,89      C:\my\Tools\Python27
35,22      C:\my\Tools\robomongo
frizik
fonte
1
Existe uma maneira de mostrar todos os arquivos e tamanho em Mb na pasta base também? Nesse caso, `C: \ my \ Tools`
Raunak Thomas
2
Além disso, ele quebra quando há muitas pastas (por exemplo, na unidade C
:)
0.00 C:\WindowsI pode otimizar isso para todas as pastas, já tentou correr como admin
Tilo
isso é bom, mas trunca os nomes das minhas pastas de componentes. qual é o comando para exibi-los inteiramente?
Sean.net 9/08/19
@ sean.net, você quer dizer que termina com "..." no caso de pastas longas? É assim que ft( Format-Table) funciona. Você pode tentar flem vez disso ( Format-List)
frizik
16

Se você tem o git instalado no seu computador (ficando cada vez mais comum), basta abrir o MINGW32 e digite: du folder

Custodio
fonte
4
Você pode usar o seguinte comando du -h -d 1 folder | sort -hse desejar tamanho legível por humanos, apenas um nível de subdiretórios e classificar por tamanho.
vard
8

Eu recomendo usar o https://github.com/aleksaan/diskusage . Muito simples e útil. E muito rápido.

Basta digitar um shell de comando

diskusage.exe -path 'd:/go; d:/Books'

e obtenha uma lista de pastas organizadas por tamanho

  1. DIR: d: / go | TAMANHO: 325.72 Mb | PROFUNDIDADE: 1
  2. DIR: d: / Livros | TAMANHO: 14.01 Mb | PROFUNDIDADE: 1

Este exemplo foi executado em 272ms no HDD.

Você pode aumentar a profundidade das subpastas para analisar, por exemplo:

diskusage.exe -path 'd:/go; d:/Books' -depth 2

e obtenha tamanhos não apenas para as pastas selecionadas, mas também para suas subpastas

  1. DIR: d: / go | TAMANHO: 325.72 Mb | PROFUNDIDADE: 1
  2. DIR: d: / go / pkg | TAMANHO: 212,88 Mb | PROFUNDIDADE: 2
  3. DIR: d: / go / src | TAMANHO: 62.57 Mb | PROFUNDIDADE: 2
  4. | DIR: d: / go / bin | TAMANHO: 30.44 Mb | PROFUNDIDADE: 2
  5. DIR: d: / Livros / Xadrez | TAMANHO: 14.01 Mb | PROFUNDIDADE: 2
  6. DIR: d: / Livros | TAMANHO: 14.01 Mb | PROFUNDIDADE: 1
  7. DIR: d: / go / api | TAMANHO: 6.41 Mb | PROFUNDIDADE: 2
  8. DIR: d: / go / teste | TAMANHO: 5.11 Mb | PROFUNDIDADE: 2
  9. DIR: d: / go / doc | TAMANHO: 4,00 Mb | PROFUNDIDADE: 2
 10. | DIR: d: / go / variado | TAMANHO: 3,82 Mb | PROFUNDIDADE: 2
 11. DIR: d: / go / lib | TAMANHO: 358.25 Kb | PROFUNDIDADE: 2

* 3.5Tb no servidor foi verificado por 3m12s

Alexander Anufriev
fonte
Nova versão lançada! github.com/aleksaan/diskusage Melhorias : 1) trabalho correto com tamanhos de link simbólico 2) informações ou mais sobre objetos analisados ​​#
Alexander Anufriev
Versão 2.0.2 lançada! github.com/aleksaan/diskusage/releases/tag/v2.0.2 - Arquivo de configuração em vez de parâmetros embutidos - Modo de uso simples (copie o diskusage para qualquer pasta, execute-o e obtenha resultados) - Saída correta dos resultados (vitória correta do símbolo de fim de linha / unix) - Salve os resultados em um arquivo ou obtenha-o no modo de console (opção 'tofile')
Alexander Anufriev
Por favor, note que você é um autor. (Em stackoverflow.com/help/promotion : "No entanto, você deve divulgar sua afiliação em suas respostas." )
aeracode
6

Aí vem um código do PowerShell que escrevo para listar o tamanho e a contagem de arquivos de todas as pastas no diretório atual. Sinta-se livre para reutilizar ou modificar de acordo com sua necessidade.

$FolderList = Get-ChildItem -Directory
foreach ($folder in $FolderList)
{
    set-location $folder.FullName
    $size = Get-ChildItem -Recurse | Measure-Object -Sum Length
    $info = $folder.FullName + "    FileCount: " + $size.Count.ToString() + "   Size: " + [math]::Round(($size.Sum / 1GB),4).ToString() + " GB"
    write-host $info
}
Ryan Lee
fonte
Funciona para mim. Útil se você estiver em um servidor sem cabeça.
precisa
Simples e elegante! Minha versão: $FolderList = Get-ChildItem -Directory -Force; $data = foreach ($folder in $FolderList) { set-location $folder.FullName; $size = Get-ChildItem -Recurse -Force | Measure-Object -Sum Length; $size | select @{n="Path"; e={$folder.Fullname}}, @{n="FileCount"; e={$_.count}}, @{n="Size"; e={$_.Sum}} } isso fornecerá objetos (mais Powershell-ish), 'FileCount' e 'Size' são números inteiros (para que você possa processá-los mais tarde, se necessário), e 'Size' está em bytes, mas você pode convertê-lo facilmente em GB (ou a unidade que você deseja) com $Data.Size / 1GB.
curropar
Ou um one-liner:$Data = dir -Directory -Force | %{ $CurrentPath = $_.FullName; Get-ChildItem $CurrentPath -Recurse -Force -ErrorAction SilentlyContinue | Measure-Object -Sum Length | select @{n="Path"; e={$CurrentPath}}, @{n="FileCount"; e={$_.count}}, @{n="Size"; e={$_.Sum}} }
curropar 14/10/19
2

Este código é testado. Você pode verificar novamente.

@ECHO OFF
CLS
SETLOCAL
::Get a number of lines contain "File(s)" to a mytmp file in TEMP location.
DIR /S /-C | FIND "bytes" | FIND /V "free" | FIND /C "File(s)" >%TEMP%\mytmp
SET /P nline=<%TEMP%\mytmp
SET nline=[%nline%]
::-------------------------------------
DIR /S /-C | FIND "bytes" | FIND /V "free" | FIND /N "File(s)" | FIND "%nline%" >%TEMP%\mytmp1
SET /P mainline=<%TEMP%\mytmp1
CALL SET size=%mainline:~29,15%
ECHO %size%
ENDLOCAL
PAUSE
Chienvela
fonte
Obrigado, ele funciona para mim com pastas menores que 1 GB, mas, por exemplo, eu tenho uma pasta de 3.976.317.115 bytes (3,70 GB), e o script retorna para mim essa sequência ") 932", você sabe por quê?
Elady
2

Eu acho que isso só funcionaria se o diretório fosse bastante estático e seu conteúdo não fosse alterado entre a execução dos dois comandos dir. Talvez uma maneira de combinar isso em um comando para evitar isso, mas funcionou para o meu propósito (eu não queria a lista completa; apenas o resumo).

Script GetDirSummary.bat:

@echo off
rem  get total number of lines from dir output
FOR /F "delims=" %%i IN ('dir /S %1 ^| find "asdfasdfasdf" /C /V') DO set lineCount=%%i
rem  dir summary is always last 3 lines; calculate starting line of summary info
set /a summaryStart="lineCount-3"
rem  now output just the last 3 lines
dir /S %1 | more +%summaryStart%

Uso:

GetDirSummary.bat c: \ temp

Resultado:

 Total Files Listed:
          22 File(s)         63,600 bytes
           8 Dir(s)  104,350,330,880 bytes free
Steve
fonte
1

Eu recebi du.exeminha distribuição git. Outro local pode ser o Microsoft ou Unxutils acima mencionados .

Depois de obter o du.exe no seu caminho. Aqui está o seu fileSizes.bat:-)

@echo ___________
@echo DIRECTORIES
@for /D %%i in (*) do @CALL du.exe -hs "%%i"
@echo _____
@echo FILES
@for %%i in (*) do @CALL du.exe -hs "%%i"
@echo _____
@echo TOTAL
@du.exe -sh "%CD%"

___________
DIRECTORIES
37M     Alps-images
12M     testfolder
_____
FILES
765K    Dobbiaco.jpg
1.0K    testfile.txt
_____
TOTAL
58M    D:\pictures\sample
Frank Nocke
fonte
1

Eu acho que sua única opção será diruse (uma solução de terceiros altamente suportada):

Obter tamanho do arquivo / diretório na linha de comando

A CLI do Windows é infelizmente bastante restritiva, você pode instalar o Cygwin como alternativa que é um sonho para ser usado em comparação com o cmd. Isso daria acesso à ferramenta Unix portada, que é a base do diruse no Windows.

Desculpe, não foi possível responder suas perguntas diretamente com um comando que você pode executar no CLI nativo.

Illizian
fonte
1
Se você só precisa du, Cygwin é um exagero. Basta ir com o GnuWin32 .
Joey
2
Na verdade, é um exagero, mas também é incrível. +1 para o seu post acima @joey (não tenho o representante para fazê-lo literalmente :()
Illizian
Na minha humilde opinião, Cygwin pode ser útil para alguns, mas está longe de ser impressionante e bastante horrível. Mas acho que os usuários do Unix dizem o mesmo sobre o Wine.
Joey
1
"wine" - arrepio, eu uso o Cygwin no meu laptop de desenvolvimento porque a duração da bateria é terrível no linux e não é conveniente executar uma VM nele. É preciso alguma configuração, mas o Cygwin é brilhante para quem sente falta do nix shell no Windows; pessoalmente, eu não gosto do Powershell; talvez seja necessário verificar o GnuWin. Obrigado @Joey.
Illizian
1

:: Obtenha um número de linhas que os comandos Dir retornam (/ -c para eliminar os separadores de números:.,) ["Tokens = 3" para examinar apenas a terceira coluna de cada linha em Dir]

FOR /F "tokens=3" %%a IN ('dir /-c "%folderpath%"') DO set /a i=!i!+1

Número da penúltima linha, onde é o número de bytes da soma dos arquivos:

set /a line=%i%-1

Finalmente, obtenha o número de bytes na penúltima linha - terceira coluna:

set i=0
FOR /F "tokens=3" %%a IN ('dir /-c "%folderpath%"') DO (
  set /a i=!i!+1
  set bytes=%%a
  If !i!==%line% goto :size  
)
:size
echo %bytes%

Como não usa a pesquisa por palavras, não haveria problemas de idioma.

Limitações:

  • Funciona apenas com pastas com menos de 2 GB (o cmd não processa números com mais de 32 bits)
  • Não lê o número de bytes das pastas internas.
Gustavo Davico
fonte
1

Experimentar:

SET FOLDERSIZE=0
FOR /F "tokens=3" %A IN ('DIR "C:\Program Files" /a /-c /s ^| FINDSTR /C:" bytes" ^| FINDSTR /V /C:" bytes free"') DO SET FOLDERSIZE=%A

Altere C: \ Arquivos de programas para a pasta desejada e altere% A para %% A se estiver usando em um arquivo em lotes

Ele retorna o tamanho de toda a pasta, incluindo subpastas e arquivos ocultos e do sistema, e funciona com pastas com mais de 2 GB

Ele grava na tela, então você terá que usar um arquivo provisório se não quiser.

FrinkTheBrave
fonte
1

O script a seguir pode ser usado para buscar e acumular o tamanho de cada arquivo em uma determinada pasta.
O caminho da pasta %folder%pode ser fornecido como argumento para este script ( %1).
Por fim, os resultados são mantidos no parâmetro%filesize%

@echo off
SET count=1
SET foldersize=0
FOR /f "tokens=*" %%F IN ('dir /s/b %folder%') DO (call :calcAccSize "%%F")
echo %filesize%
GOTO :eof

:calcAccSize
 REM echo %count%:%1
 REM set /a count+=1
 set /a foldersize+=%~z1
 GOTO :eof

Nota: O método calcAccSizetambém pode imprimir o conteúdo da pasta (comentado no exemplo acima)

Lior Kirshner
fonte
1

Então, aqui está uma solução para os seus pedidos da maneira que você solicitou originalmente. Isso dará ao usuário legibilidade do tamanho do arquivo, sem os limites de tamanho que todos estão enfrentando. Compatível com Win Vista ou mais recente. XP disponível apenas se o Robocopy estiver instalado. Basta soltar uma pasta nesse arquivo em lotes ou usar o melhor método mencionado abaixo.

@echo off
setlocal enabledelayedexpansion
set "vSearch=Files :"

For %%i in (%*) do (
    set "vSearch=Files :"
    For /l %%M in (1,1,2) do ( 
        for /f "usebackq tokens=3,4 delims= " %%A in (`Robocopy "%%i" "%%i" /E /L /NP /NDL /NFL ^| find "!vSearch!"`) do (
            if /i "%%M"=="1" (
                set "filecount=%%A"
                set "vSearch=Bytes :"
            ) else (
                set "foldersize=%%A%%B"
            )
        )
    )
    echo Folder: %%~nxi FileCount: !filecount! Foldersize: !foldersize!
    REM remove the word "REM" from line below to output to txt file
    REM echo Folder: %%~nxi FileCount: !filecount! Foldersize: !foldersize!>>Folder_FileCountandSize.txt
)
pause

Para poder usar esse arquivo em lotes, coloque-o convenientemente na pasta SendTo. Isso permitirá que você clique com o botão direito do mouse em uma pasta ou em uma seleção de pastas, clique na opção SendTo e selecione esse arquivo em lotes.

Para encontrar a pasta SendTo no seu computador, a maneira mais simples é abrir o cmd e copiar nesta linha como está.

explorer C:\Users\%username%\AppData\Roaming\Microsoft\Windows\SendTo

Julio Verne
fonte
Para quem estiver preocupado, o Robocopy moverá os arquivos ... não. a opção / l lista apenas. Além disso, o Robocopy não é de terceiros, o Robocopy é instalado no Windows por padrão a partir do Vista, XP, você precisa instalá-lo.
Julesverne 15/05/19
Obrigado pela adição. Fico feliz em ver esse tópico ainda atraindo atenção ;-) Talvez queira adicionar como instalar o robocopy (ótima ferramenta!).
Eldad Assis
0

Eu resolvi um problema semelhante. Alguns dos métodos desta página são lentos e outros são problemáticos em um ambiente multilíngue (todos supõem inglês). Eu encontrei uma solução simples usando vbscript no cmd. É testado em W2012R2 e W7.

>%TEMP%\_SFSTMP$.VBS ECHO/Set objFSO = CreateObject("Scripting.FileSystemObject"):Set objFolder = objFSO.GetFolder(%1):WScript.Echo objFolder.Size
FOR /F %%? IN ('CSCRIPT //NOLOGO %TEMP%\_SFSTMP$.VBS') DO (SET "S_=%%?"&&(DEL %TEMP%\_SFSTMP$.VBS))

Ele configurou a variável de ambiente S_. Obviamente, você pode alterar a última linha para exibir diretamente o resultado para, por exemplo,

FOR /F %%? IN ('CSCRIPT //NOLOGO %TEMP%\_SFSTMP$.VBS') DO (ECHO "Size of %1 is %%?"&&(DEL %TEMP%\_SFSTMP$.VBS))

Você pode usá-lo como sub-rotina ou como cmd independente. Parâmetro é o nome da pasta testada fechada entre aspas.

arpi
fonte
-3

O método mais fácil de obter apenas o tamanho total é o PowerShell, mas ainda é limitado pelo fato de os nomes de caminhos com mais de 260 caracteres não serem incluídos no total.

raio
fonte
2
Esta é uma resposta ruim e ruim. Qual é a linha de comando ou código?
Tatarin 11/08/2015