Ottieni dimensioni cartella dalla riga di comando di Windows


128

In Windows è possibile ottenere le dimensioni di una cartella dalla riga di comando senza utilizzare strumenti di terze parti?

Voglio lo stesso risultato che otterresti facendo clic con il pulsante destro del mouse sulla cartella in Esplora risorse di Windows → Proprietà.

Risposte:


120

Puoi semplicemente aggiungere le dimensioni in modo ricorsivo (il seguente è un file batch):

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

Tuttavia, ciò presenta diversi problemi perché cmdè limitato all'aritmetica intera con segno a 32 bit. Quindi avrà dimensioni superiori a 2 GiB errate 1 . Inoltre conterà probabilmente collegamenti simbolici e giunzioni più volte, quindi nella migliore delle ipotesi è un limite superiore, non la dimensione reale (avrai comunque quel problema con qualsiasi strumento).

Un'alternativa è PowerShell:

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

o più corto:

ls -r | measure -sum Length

Se lo vuoi più bello:

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" }
}

Puoi usarlo direttamente da cmd:

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

1 Ho una libreria di bignum parzialmente finita in file batch da qualche parte che almeno ottiene l'addizione intera di precisione arbitraria a destra. Dovrei davvero rilasciarlo, immagino :-)


+1 Stavo vagando nell'output get-help * per trovare qualcosa del genere.
Steve,

2
Steve, ai miei occhi PowerShell è molto più Unix-y di Unix in quanto la maggior parte dei comandi di base sono davvero ortogonali. In Unix dufornisce le dimensioni della directory ma tutto ciò che sta facendo è camminare sull'albero e riassumere. Qualcosa che può essere espresso molto elegantemente in una pipeline come qui :-). Quindi per PowerShell di solito cerco come scomporre l'obiettivo di alto livello in opportune operazioni di livello inferiore.
Joey,

3
Vedo, sembra ignorare le cartelle nascoste in quel modo. ls -force -r funziona se voglio includere anche le cartelle nascoste.
garg

2
folder\*non funziona per me la dimensione della cartella che ho messo nel posto mostra 0 byte, c'è qualche soluzione?
Ricercatore IT il

2
Una versione leggermente migliore: powershell -noprofile -command "'{0: N0}' -f (ls -r | measure -s Length) .Sum"
zumalifeguard

120

Esiste uno strumento di Windows integrato per questo:

dir /s 'FolderName'

Questo stamperà molte informazioni non necessarie ma alla fine saranno le dimensioni della cartella in questo modo:

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

Se è necessario includere cartelle nascoste, aggiungere /a.


7
Questa è la soluzione più elegante se non hai bisogno di un valore di ritorno intero. Nota: l'opzione '/ a' includerà i file nascosti e di sistema nella dimensione totale.
Oran D. Lord,

1
Suppongo che non sia possibile stampare file di dimensioni in alcune unità più utili, come kB o MB, giusto?
David Ferenczy Rogožan,

Virgolette doppie anziché virgolette singole.
user2924019

66

Suggerisco di scaricare l'utilità DU dalla Suite Sysinternals fornita da Microsoft a questo 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

Mentre ci sei, dai un'occhiata alle altre utility. Sono un salvavita per ogni professionista di Windows


11
Difficilmente "senza strumenti di terze parti", immagino.
Joey,

11
Oh giusto, ma pensava che la famiglia non dovesse essere considerata "terza parte".
Steve,

1
Bene, garantito, ma è ancora un download aggiuntivo (o l'utilizzo \\live.sysinternals.comse esiste ancora). Concordo con tutto il cuore, tuttavia, che tutti gli strumenti di sistema dovrebbero essere inclusi per impostazione predefinita. Sebbene per molti usi PowerShell sia un sostituto abbastanza degno.
Joey,

1
Qualcuno ha detto Powershell? Prova quanto segue: "{0: N2}" -f ((Get-ChildItem C: \ Temp -Recurse | Measure-Object -Property Length -Sum) .Sum / 1MB) + "MB"
John Homer

3
Consiglio a tutti di scaricare qualunque cosa Mark Russinovich sviluppi :) Continuo a vedere questo nome ogni volta che trovo uno strumento che mi salva la vita.
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"

Lo stesso ma 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

Questo dovrebbe produrre il seguente risultato:

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

1
C'è un modo per mostrare anche tutti i file e le dimensioni in Mb nella cartella di base? In questo caso `C: \ my \ Tools`
Raunak Thomas,

2
Inoltre si rompe quando ci sono molte cartelle (ad esempio nell'unità C
:)

0.00 C:\Windowsposso ottimizzare questo per tutte le cartelle, provato già eseguito come admin
Tilo

questo è buono ma tronca i nomi delle mie cartelle dei componenti. qual è il comando per visualizzarli interamente?
sean.net,

@ sean.net vuoi dire che termina con "..." in caso di cartelle lunghe? Ecco come ft( Format-Table) funziona. Puoi flinvece provare ( Format-List)
frizik il

16

Se hai installato git sul tuo computer (diventando sempre più comune) basta aprire MINGW32 e digitare: du folder


4
È possibile utilizzare il comando seguente du -h -d 1 folder | sort -hse si desidera la dimensione leggibile dall'uomo, solo un livello di sottodirectory e ordinare per dimensione.
vard

8

Consiglio di utilizzare l' utilità https://github.com/aleksaan/diskusage . Molto semplice e utile E molto veloce.

Basta digitare una shell dei comandi

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

e ottieni un elenco di cartelle ordinate per dimensione

  1. | DIR: d: / go | DIMENSIONE: 325.72 Mb | PROFONDITÀ: 1
  2. | DIR: d: / Libri | DIMENSIONE: 14.01 Mb | PROFONDITÀ: 1

Questo esempio è stato eseguito a 272ms su HDD.

È possibile aumentare la profondità delle sottocartelle da analizzare, ad esempio:

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

e ottenere dimensioni non solo per le cartelle selezionate ma anche per le sue sottocartelle

  1. | DIR: d: / go | DIMENSIONE: 325.72 Mb | PROFONDITÀ: 1
  2. | DIR: d: / go / pkg | DIMENSIONE: 212.88 Mb | PROFONDITÀ: 2
  3. | DIR: d: / go / src | DIMENSIONE: 62.57 Mb | PROFONDITÀ: 2
  4. | DIR: d: / go / bin | DIMENSIONE: 30.44 Mb | PROFONDITÀ: 2
  5. | DIR: d: / Libri / Scacchi | DIMENSIONE: 14.01 Mb | PROFONDITÀ: 2
  6. | DIR: d: / Libri | DIMENSIONE: 14.01 Mb | PROFONDITÀ: 1
  7. | DIR: d: / go / api | DIMENSIONE: 6.41 Mb | PROFONDITÀ: 2
  8. | DIR: d: / go / test | DIMENSIONE: 5.11 Mb | PROFONDITÀ: 2
  9. | DIR: d: / go / doc | DIMENSIONE: 4.00 Mb | PROFONDITÀ: 2
 10. | DIR: d: / go / misc | DIMENSIONE: 3.82 Mb | PROFONDITÀ: 2
 11. | DIR: d: / go / lib | TAGLIA: 358,25 Kb | PROFONDITÀ: 2

* 3,5 TB sul server sono stati scansionati per 3m12s


Nuova versione rilasciata! github.com/aleksaan/diskusage Miglioramenti: 1) lavoro corretto con le dimensioni di symlink 2) orevall informazioni sugli oggetti analizzati
Alexander Anufriev

Rilasciata la versione 2.0.2! github.com/aleksaan/diskusage/releases/tag/v2.0.2 - File di configurazione anziché parametri incorporati - Modalità di utilizzo semplice (copia il diskusage eseguibile in qualsiasi cartella, eseguilo e ottieni risultati) - Output dei risultati corretti (simbolo di fine riga corretto vincere / unix) - Salva i risultati su file o scaricali in modalità console (opzione 'tofile')
Alexander Anufriev

Per favore, nota che sei un autore. (Da stackoverflow.com/help/promotion : "Tuttavia, devi rivelare la tua affiliazione nelle risposte." )
aeracode

6

Ecco un codice PowerShell che scrivo per elencare le dimensioni e il conteggio dei file per tutte le cartelle nella directory corrente. Sentiti libero di riutilizzare o modificare secondo le tue necessità.

$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
}

Per me va bene. Utile se sei su un server senza testa.
Andrew Pate il

Semplice ed elegante! La mia versione: $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}} } questo fornirà oggetti (più Powershell-ish), 'FileCount' e 'Size' sono numeri interi (quindi puoi elaborarli in seguito, se necessario), e 'Size' è in byte, ma puoi facilmente convertirlo in GB (o l'unità desiderata) con $Data.Size / 1GB.
Curropar,

O un 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

2

Questo codice è stato testato. Puoi controllarlo di nuovo.

@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

Grazie, funziona per me con cartelle inferiori a 1 GB, ma ad esempio ho una cartella di 3.976.317.115 byte (3,70 GB) e lo script restituisce questa stringa ") 932", sai perché?
elady,

2

Immagino che funzionerebbe solo se la directory è abbastanza statica e il suo contenuto non cambia tra l'esecuzione dei due comandi dir. Forse un modo per combinare questo in un comando per evitarlo, ma questo ha funzionato per il mio scopo (non volevo l'elenco completo; solo il riepilogo).

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

Produzione:

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

1

Ho ottenuto du.execon la mia distribuzione git. Un altro posto potrebbe essere il già citato Microsoft o Unxutils .

Una volta che hai du.exe nel tuo percorso. Ecco il tuo 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

1

Penso che la tua unica opzione sarà diruse (una soluzione di terze parti altamente supportata):

Ottieni le dimensioni di file / directory dalla riga di comando

L'interfaccia della riga di comando di Windows è purtroppo piuttosto restrittiva, in alternativa è possibile installare Cygwin che è un sogno da usare rispetto a cmd. Ciò ti darebbe accesso allo strumento Unix con port, che è la base di diruse su Windows.

Spiacenti, non sono stato in grado di rispondere direttamente alle tue domande con un comando che puoi eseguire sul cli nativo.


1
Se hai solo bisogno, duCygwin è eccessivo. Basta andare con GnuWin32 .
Joey,

2
In effetti è eccessivo, ma è anche fantastico. +1 per il tuo post sopra @joey (non ho il rappresentante per farlo letteralmente :()
Illizian

Secondo la mia modesta opinione, Cygwin può essere utile per alcuni, ma è tutt'altro che fantastico e piuttosto orribile. Ma suppongo che gli utenti Unix abbiano detto lo stesso di Wine.
Joey,

1
"wine" - rabbrividisco, utilizzo Cygwin sul mio laptop di sviluppo perché la durata della batteria è spaventosa sotto Linux e non è conveniente far funzionare una VM. Ci vuole un po 'di configurazione, ma Cygwin è geniale per quelli tra noi che mancano la shell nix in Windows, personalmente non mi piace Powershell, ma dovrei controllare GnuWin. Grazie @Joey.
Illizian,

1

:: Ottieni un numero di righe restituite dai comandi Dir (/ -c per eliminare i separatori numerici:.,) ["Token = 3" per guardare solo la terza colonna di ogni riga in Dir]

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

Numero della penultima riga, dove è il numero di byte della somma dei file:

set /a line=%i%-1

Finalmente ottieni il numero di byte nella penultima riga - 3a colonna:

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%

Poiché non utilizza la ricerca di parole, non avrebbe problemi di lingua.

limitazioni:

  • Funziona solo con cartelle inferiori a 2 GB (cmd non gestisce numeri superiori a 32 bit)
  • Non legge il numero di byte delle cartelle interne.

1

Provare:

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

Cambia C: \ Programmi nella cartella che desideri e cambia da% A a %% A se lo usi in un file batch

Restituisce le dimensioni dell'intera cartella, comprese le sottocartelle e i file nascosti e di sistema, e funziona con cartelle superiori a 2 GB

Scrive sullo schermo, quindi dovrai usare un file provvisorio se non lo desideri.


1

Il seguente script può essere utilizzato per recuperare e accumulare le dimensioni di ciascun file in una determinata cartella.
Il percorso della cartella %folder%può essere fornito come argomento per questo script ( %1).
Alla fine, i risultati vengono mantenuti nel parametro%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: il metodo calcAccSizepuò anche stampare il contenuto della cartella (commentato nell'esempio sopra)


1

Quindi, ecco una soluzione per entrambe le tue richieste nel modo che avevi inizialmente richiesto. Fornirà la leggibilità umana della dimensione del file senza i limiti della dimensione del file che tutti stanno vivendo. Compatibile con Win Vista o più recente. XP disponibile solo se Robocopy è installato. Basta rilasciare una cartella su questo file batch o utilizzare il metodo migliore indicato di seguito.

@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

Per poter utilizzare questo file batch, inserirlo comodamente nella cartella SendTo. Ciò ti consentirà di fare clic con il pulsante destro del mouse su una cartella o selezione di cartelle, fare clic sull'opzione Invia, quindi selezionare questo file batch.

Per trovare la cartella SendTo sul tuo computer, il modo più semplice è aprire cmd, quindi copiare in questa riga così com'è.

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


Per chiunque sia preoccupato, Robocopy sposta i file .. no. l'opzione / l elenca solo. Inoltre, Robocopy non è di terze parti, Robocopy è installato in Windows per impostazione predefinita da Vista su, XP è necessario installarlo.
julesverne,

Grazie per l'aggiunta. Sono contento di vedere che questo thread attira ancora l'attenzione ;-) Potrebbe voler aggiungere come installare robocopy (ottimo strumento!).
Eldad Assis,

0

Ho risolto un problema simile. Alcuni dei metodi in questa pagina sono lenti e alcuni sono problematici in un ambiente multilingue (tutti suppongono l'inglese). Ho trovato una soluzione semplice usando vbscript in cmd. È testato in 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))

Imposta la variabile d'ambiente S_. Naturalmente, è possibile modificare l'ultima riga per visualizzare direttamente il risultato, ad es

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

Puoi usarlo come subroutine o come cmd standlone. Il parametro è il nome della cartella testata chiusa tra virgolette.


-3

Il metodo più semplice per ottenere solo la dimensione totale è PowerShell, ma è ancora limitato dal fatto che i percorsi più lunghi di 260 caratteri non sono inclusi nel totale


2
Questa è una risposta negativa e negativa. Qual è la riga di comando o il codice?
Tatarin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.