Obtener el tamaño de la carpeta desde la línea de comandos de Windows

128

¿Es posible en Windows obtener el tamaño de una carpeta desde la línea de comandos sin usar ninguna herramienta de terceros?

Quiero el mismo resultado que obtendría al hacer clic derecho en la carpeta en el explorador de Windows → propiedades.

Eldad Assis
fuente

Respuestas:

120

Puede sumar tamaños recursivamente (el siguiente es un archivo por lotes):

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

Sin embargo, esto tiene varios problemas porque cmdse limita a la aritmética de enteros con signo de 32 bits. Por lo tanto, obtendrá tamaños superiores a 2 GiB incorrectos 1 . Además, es probable que cuente los enlaces simbólicos y las uniones varias veces, por lo que es, en el mejor de los casos, un límite superior, no el tamaño real (sin embargo, tendrá ese problema con cualquier herramienta).

Una alternativa es PowerShell:

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

o más corto:

ls -r | measure -sum Length

Si lo quieres más 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" }
}

Puede usar esto directamente desde cmd:

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

1 Tengo una biblioteca bignum parcialmente terminada en archivos por lotes en algún lugar que al menos obtiene la suma de enteros de precisión arbitraria. Realmente debería lanzarlo, supongo :-)

Joey
fuente
+1 Estaba deambulando en la salida de get-help * para encontrar algo así.
Steve
2
Steve, en mi opinión, PowerShell es mucho más Unix-y que Unix en que la mayoría de los comandos centrales son realmente ortogonales. En Unix duda el tamaño del directorio, pero todo lo que hace es caminar por el árbol y resumir. Algo que se puede expresar de manera muy elegante en una tubería como aquí :-). Entonces, para PowerShell, generalmente busco cómo puede descomponer el objetivo de alto nivel en operaciones adecuadas de nivel inferior.
Joey
3
Ya veo, parece ignorar las carpetas ocultas de esa manera. ls -force -r funciona si quiero incluir carpetas ocultas también.
Garg
2
folder\*no me funciona el tamaño de la carpeta que puse en el lugar muestra 0 bytes, ¿hay alguna solución?
Investigador de TI
2
Una versión un poco mejor: powershell -noprofile -command "'{0: N0}' -f (ls -r | measure -s Length) .Sum"
zumalifeguard
120

Hay una herramienta de Windows incorporada para eso:

dir /s 'FolderName'

Esto imprimirá mucha información innecesaria, pero al final será el tamaño de la carpeta de esta manera:

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

Si necesita incluir carpetas ocultas, agregue /a.

Nir Duan
fuente
77
Esta es la solución más elegante si no necesita un valor de retorno entero. Nota: el modificador '/ a' incluirá archivos ocultos y del sistema en el tamaño total.
Oran D. Lord
1
Supongo que no es posible imprimir tamaños de archivo en algunas unidades más útiles, como kB o MB, ¿verdad?
David Ferenczy Rogožan
Comillas dobles en lugar de comillas simples.
user2924019
66

Sugiero descargar la utilidad DU del Sysinternals Suite provisto por Microsoft en este enlace 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

Mientras lo hace, eche un vistazo a las otras utilidades. Son un salvavidas para todos los Windows Professional

Steve
fuente
11
Eso es apenas "sin ninguna herramienta de terceros", supongo.
Joey
11
Ah, claro, pero pensaba que la familia no debería ser considerada 'tercera parte'.
Steve
1
Bueno, concedido, pero sigue siendo una descarga adicional (o usar \\live.sysinternals.comsi todavía existe). Sin embargo, estoy totalmente de acuerdo en que todas las herramientas de sysinternals deben incluirse por defecto. Aunque para muchos usos, PowerShell es un reemplazo bastante digno.
Joey
1
¿Alguien dijo Powershell? Pruebe lo siguiente: "{0: N2}" -f ((Get-ChildItem C: \ Temp -Recurse | Measure-Object -Property Length -Sum) .Sum / 1MB) + "MB"
John Homer
3
Les sugiero que descarguen todo lo que Mark Russinovich desarrolle :) Sigo viendo este nombre cada vez que encuentro una herramienta que me salva la vida.
dkellner
46

Un trazador de líneas:

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"

Lo mismo pero solo 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

Esto debería producir el siguiente 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
fuente
1
¿Hay alguna manera de mostrar también todos los archivos y tamaños en Mb en la carpeta base? En este caso `C: \ my \ Tools`
Raunak Thomas
2
Además, se rompe cuando hay muchas carpetas (por ejemplo, en la unidad C
:)
0.00 C:\Windows¿Puedo optimizar esto para todas las carpetas? Intenté ejecutar como administrador
Tilo
Esto es bueno pero trunca los nombres de las carpetas de mis componentes. ¿Cuál es el comando para mostrarlos por completo?
sean.net
@ sean.net ¿quiere decir que termina con "..." en el caso de carpetas largas? Así es como funciona ft( Format-Table). Puedes probar en su fllugar ( Format-List)
frizik
16

Si tiene instalado git en su computadora (cada vez más común) simplemente abra MINGW32 y escriba: du folder

Custodio
fuente
44
Puede usar el siguiente comando du -h -d 1 folder | sort -hsi desea un tamaño legible por humanos, un solo nivel de subdirectorios y ordenar por tamaño.
vard
8

Recomiendo usar la utilidad https://github.com/aleksaan/diskusage . Muy simple y útil. Y muy rapido.

Simplemente escriba un shell de comando

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

y obtener una lista de carpetas ordenadas por tamaño

  1. | DIR: d: / ir | TAMAÑO: 325.72 Mb | PROFUNDIDAD: 1
  2. | DIR: d: / Libros | TAMAÑO: 14.01 Mb | PROFUNDIDAD: 1

Este ejemplo se ejecutó a 272 ms en HDD.

Puede aumentar la profundidad de las subcarpetas para analizar, por ejemplo:

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

y obtener tamaños no solo para las carpetas seleccionadas sino también para sus subcarpetas

  1. | DIR: d: / ir | TAMAÑO: 325.72 Mb | PROFUNDIDAD: 1
  2. | DIR: d: / ir / paquete | TAMAÑO: 212.88 Mb | PROFUNDIDAD: 2
  3. | DIR: d: / go / src | TAMAÑO: 62.57 Mb | PROFUNDIDAD: 2
  4. | DIR: d: / ir / bin | TAMAÑO: 30.44 Mb | PROFUNDIDAD: 2
  5. | DIR: d: / Libros / Ajedrez | TAMAÑO: 14.01 Mb | PROFUNDIDAD: 2
  6. | DIR: d: / Libros | TAMAÑO: 14.01 Mb | PROFUNDIDAD: 1
  7. | DIR: d: / ir / api | TAMAÑO: 6.41 Mb | PROFUNDIDAD: 2
  8. | DIR: d: / ir / prueba | TAMAÑO: 5.11 Mb | PROFUNDIDAD: 2
  9. | DIR: d: / go / doc | TAMAÑO: 4.00 Mb | PROFUNDIDAD: 2
 10. | DIR: d: / ir / misceláneo | TAMAÑO: 3.82 Mb | PROFUNDIDAD: 2
 11. | DIR: d: / go / lib | TAMAÑO: 358.25 Kb | PROFUNDIDAD: 2

* 3.5Tb en el servidor ha sido escaneado por 3m12s

Alexander Anufriev
fuente
Nueva versión lanzada! github.com/aleksaan/diskusage Mejoras: 1) trabajo correcto con tamaños de enlaces simbólicos 2) información general sobre objetos analizados
Alexander Anufriev
¡Versión 2.0.2 lanzada! github.com/aleksaan/diskusage/releases/tag/v2.0.2 - Archivo de configuración en lugar de parámetros en línea - Modo de uso simple (copie el disco ejecutable en cualquier carpeta, ejecútelo y obtenga resultados) - Corrija la salida de resultados (el símbolo correcto al final de la línea gana / unix) - Guarde los resultados en el archivo o consígalo en modo consola (opción 'tofile')
Alexander Anufriev
Por favor, tenga en cuenta que usted es un autor. (De stackoverflow.com/help/promotion : "Sin embargo, debe divulgar su afiliación en sus respuestas" )
aeracode
6

Aquí viene un código de PowerShell que escribo para enumerar el tamaño y el recuento de archivos para todas las carpetas en el directorio actual. Siéntase libre de reutilizar o modificar según sus necesidades.

$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
fuente
Funciona para mi. Útil si estás en un servidor sin cabeza.
andrew pate
Simple y elegante! Mi versión: $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}} } Esto proporcionará objetos (más Powershell-ish), 'FileCount' y 'Size' son enteros (por lo que puede procesarlos más tarde, si es necesario), y 'Size' está en bytes, pero podría convertirlo fácilmente a GB (o la unidad que desee) con $Data.Size / 1GB.
curropar
O una $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}} }
frase
2

Este código está probado. Puedes verificarlo de nuevo.

@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
fuente
Gracias, funciona para mí con carpetas de menos de 1GB, pero por ejemplo, tengo una carpeta de 3,976,317,115 bytes (3.70GB), y el script me devuelve esta cadena ") 932", ¿sabes por qué?
elady
2

Supongo que esto solo funcionaría si el directorio es bastante estático y su contenido no cambia entre la ejecución de los dos comandos dir. Tal vez una forma de combinar esto en un comando para evitar eso, pero esto funcionó para mi propósito (no quería la lista completa; solo el resumen).

GetDirSummary.bat Script:

@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

Salida:

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

Llegué du.execon mi distribución git. Otro lugar podría ser Microsoft o Unxutils mencionados anteriormente .

Una vez que tengas du.exe en tu camino. Aquí está tu 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
fuente
1

Creo que su única opción será diruse (una solución de terceros altamente compatible):

Obtener el tamaño del archivo / directorio desde la línea de comando

La CLI de Windows es, por desgracia, bastante restrictiva, también puede instalar Cygwin, que es un sueño usar en comparación con cmd. Eso le daría acceso a la herramienta de Unix portada, que es la base de diruse en Windows.

Lo siento, no pude responder sus preguntas directamente con un comando que puede ejecutar en el cli nativo.

Illizian
fuente
1
Si solo necesitas, duentonces Cygwin es una exageración. Solo ve con GnuWin32 .
Joey
2
De hecho, es excesivo, pero también es increíble. +1 para tu publicación arriba @joey (no tengo el representante para hacerlo literalmente :()
Illizian
En mi humilde opinión, Cygwin puede ser útil para algunos, pero está lejos de ser increíble y bastante horrible. Pero supongo que los usuarios de Unix dicen lo mismo sobre Wine.
Joey
1
"vino": estremecimiento, uso Cygwin en mi computadora portátil de desarrollo porque la duración de la batería es pésima en Linux y no es conveniente ejecutar una VM en ella. Requiere algo de configuración, pero Cygwin es brillante para aquellos de nosotros que extrañamos el shell nix en Windows, personalmente no me gusta Powershell, aunque quizás tenga que revisar GnuWin. Gracias @ Joey.
Illizian
1

:: Obtenga una cantidad de líneas que los comandos Dir devuelven (/ -c para eliminar los separadores de números:.,) ["Tokens = 3" para mirar solo la tercera columna de cada línea en Dir]

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

Número de la penúltima línea, donde es el número de bytes de la suma de archivos:

set /a line=%i%-1

Finalmente obtenga el número de bytes en la penúltima línea - 3ra columna:

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 no utiliza la búsqueda por palabras, no tendría problemas de idioma.

Limitaciones:

  • Funciona solo con carpetas de menos de 2 GB (cmd no maneja números de más de 32 bits)
  • No lee el número de bytes de las carpetas internas.
Gustavo Davico
fuente
1

Tratar:

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

Cambie C: \ Archivos de programa a la carpeta que desee y cambie% A a %% A si lo usa en un archivo por lotes

Devuelve el tamaño de toda la carpeta, incluidas las subcarpetas y los archivos ocultos y del sistema, y ​​funciona con carpetas de más de 2 GB

Escribe en la pantalla, por lo que tendrás que usar un archivo provisional si no quieres eso.

FrinkTheBrave
fuente
1

La siguiente secuencia de comandos se puede utilizar para recuperar y acumular el tamaño de cada archivo en una carpeta determinada.
La ruta de la carpeta %folder%se puede proporcionar como argumento para este script ( %1).
En última instancia, los resultados se mantienen en el 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: El método calcAccSizetambién puede imprimir el contenido de la carpeta (comentado en el ejemplo anterior)

Lior Kirshner
fuente
1

Así que aquí hay una solución para sus dos solicitudes de la manera que solicitó originalmente. Le dará un tamaño de archivo de legibilidad humana sin los límites de tamaño de archivo que todos están experimentando. Compatible con Win Vista o más reciente. XP solo está disponible si Robocopy está instalado. Simplemente suelte una carpeta en este archivo por lotes o utilice el mejor método mencionado a continuación.

@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 utilizar este archivo por lotes, colóquelo convenientemente en su carpeta SendTo. Esto le permitirá hacer clic derecho en una carpeta o selección de carpetas, hacer clic en la opción Enviar a y luego seleccionar este archivo por lotes.

Para encontrar la carpeta SendTo en su computadora, la forma más simple es abrir cmd y luego copiar en esta línea tal como está.

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

Julio Verne
fuente
Para cualquier persona preocupada, Robocopy moverá archivos ... no lo haga. la opción / l solo enumera. Además, Robocopy no es de terceros, Robocopy está instalado en Windows de forma predeterminada desde Vista en adelante, XP necesita instalarlo.
julesverne
Gracias por la adicion. Me alegra ver que este hilo sigue llamando la atención ;-) Puede que desee agregar cómo instalar robocopy (¡gran herramienta!).
Eldad Assis
0

Resolví un problema similar. Algunos de los métodos en esta página son lentos y otros son problemáticos en un entorno multilenguaje (todos suponen inglés). Encontré una solución simple usando vbscript en cmd. Se prueba en W2012R2 y 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))

Establece la variable de entorno S_. Por supuesto, puede cambiar la última línea para mostrar directamente el resultado, por ejemplo

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

Puede usarlo como subrutina o como cmd independiente. El parámetro es el nombre de la carpeta probada cerrada entre comillas.

arpi
fuente
-3

El método más fácil para obtener solo el tamaño total es powershell, pero aún está limitado por el hecho de que los nombres de ruta de más de 260 caracteres no están incluidos en el total

rayo
fuente
2
Esta es una respuesta mala y pobre. ¿Cuál es la línea de comando o código?
Tatarin