Obtenir la taille du dossier à partir de la ligne de commande Windows

128

Est-il possible dans Windows d'obtenir la taille d'un dossier à partir de la ligne de commande sans utiliser d'outil tiers?

Je veux le même résultat que vous obtiendriez en cliquant avec le bouton droit sur le dossier dans l'explorateur Windows → propriétés.

Eldad Assis
la source

Réponses:

120

Vous pouvez simplement additionner les tailles de manière récursive (ce qui suit est un fichier de commandes):

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

Cependant, cela pose plusieurs problèmes car il cmdest limité à l'arithmétique d'entiers signés 32 bits. Ainsi, les tailles supérieures à 2 Gio seront fausses 1 . De plus, il comptera probablement plusieurs fois les liens symboliques et les jonctions, donc c'est au mieux une limite supérieure, pas la taille réelle (vous aurez ce problème avec n'importe quel outil, cependant).

Une alternative est PowerShell:

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

ou plus court:

ls -r | measure -sum Length

Si vous le voulez plus joli:

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

Vous pouvez l'utiliser directement depuis cmd:

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

1 J'ai une bibliothèque bignum partiellement terminée dans des fichiers batch quelque part qui obtient au moins une addition d'entiers de précision arbitraire. Je devrais vraiment le sortir, je suppose :-)

Joey
la source
+1 J'étais juste en train d'errer dans la sortie get-help * pour trouver quelque chose comme ça.
Steve
2
Steve, à mes yeux, PowerShell est bien plus Unix-y qu'Unix dans la mesure où la plupart des commandes principales sont vraiment orthogonales. Dans Unix, dudonne la taille du répertoire, mais tout ce qu'il fait est de parcourir l'arborescence et de résumer. Quelque chose qui peut être très élégamment exprimé dans un pipeline comme ici :-). Donc, pour PowerShell, je cherche généralement comment vous pouvez décomposer l'objectif de haut niveau en opérations de niveau inférieur appropriées.
Joey
3
Je vois, il semble ignorer les dossiers cachés de cette façon. ls -force -r fonctionne si je veux également inclure des dossiers cachés.
garg
2
folder\*ne fonctionne pas pour moi la taille du dossier que j'ai mis à la place montre 0 octets, y a-t-il une solution?
chercheur en informatique
2
Une version légèrement plus esthétique: powershell -noprofile -command "'{0: N0}' -f (ls -r | measure -s Length) .Sum"
zumalifeguard
120

Il existe un outil Windows intégré pour cela:

dir /s 'FolderName'

Cela imprimera beaucoup d'informations inutiles mais la fin sera la taille du dossier comme ceci:

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

Si vous devez inclure des dossiers cachés, ajoutez /a.

Nir Duan
la source
7
C'est la solution la plus élégante si vous n'avez pas besoin d'une valeur de retour entière. Remarque: le commutateur «/ a» inclura les fichiers cachés et système dans la taille totale.
Oran D. Lord
1
Je suppose qu'il n'est pas possible d'imprimer des tailles de fichier dans certaines unités plus utiles, comme Ko ou Mo, non?
David Ferenczy Rogožan
Guillemets doubles au lieu de guillemets simples.
user2924019
66

Je suggère de télécharger l'utilitaire DU à partir de la suite Sysinternals fournie par Microsoft à ce lien 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

Pendant que vous y êtes, jetez un œil aux autres utilitaires. Ils sauvent la vie de chaque professionnel de Windows

Steve
la source
11
Ce n'est guère "sans outil tiers", je suppose.
Joey
11
Oh oui, mais il pensait que la famille ne devait pas être considérée comme une «tierce partie».
Steve
1
Eh bien, d'accord, mais c'est toujours un téléchargement supplémentaire (ou en utilisant \\live.sysinternals.comsi cela existe toujours). Je suis tout à fait d'accord cependant, que tous les outils sysinternals devraient être inclus par défaut. Bien que pour de nombreuses utilisations, PowerShell soit un remplacement tout à fait valable.
Joey
1
Quelqu'un a-t-il dit Powershell? Essayez ce qui suit: "{0: N2}" -f ((Get-ChildItem C: \ Temp -Recurse | Measure-Object -Property Length -Sum) .Sum / 1MB) + "MB"
John Homer
3
Je vous suggère à tous de télécharger tout ce que Mark Russinovich développe :) Je continue de voir ce nom chaque fois que je trouve un outil qui me sauve la vie.
dkellner
46

Bon mot:

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"

Idem mais Powershell uniquement:

$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

Cela devrait produire le résultat suivant:

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
la source
1
Existe-t-il également un moyen d'afficher tous les fichiers et leur taille en Mo dans le dossier de base? Dans ce cas `C: \ my \ Tools`
Raunak Thomas
2
De plus, il se brise quand il y a beaucoup de dossiers (par exemple dans le lecteur C
:)
0.00 C:\Windowspuis-je optimiser cela pour tous les dossiers, essayé déjà exécuté en tant qu'administrateur
Tilo
c'est bien mais cela tronque les noms de mes dossiers de composants. quelle est la commande pour les afficher entièrement?
sean.net
@ sean.net voulez-vous dire qu'il se termine par "..." dans le cas de longs dossiers? Voilà comment ft( Format-Table) fonctionne. Vous pouvez essayer à la flplace ( Format-List)
frizik
16

Si vous avez installé git sur votre ordinateur (qui devient de plus en plus courant), ouvrez simplement MINGW32 et tapez: du folder

Custodio
la source
4
Vous pouvez utiliser la commande suivante du -h -d 1 folder | sort -hsi vous souhaitez une taille lisible par l'homme, un niveau de sous-répertoires uniquement et un tri par taille.
vard le
8

Je recommande d'utiliser https://github.com/aleksaan/diskusage utilitaire . Très simple et utile. Et très vite.

Tapez simplement un shell de commande

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

et obtenir la liste des dossiers classés par taille

  1. | DIR: d: / go | TAILLE: 325,72 Mb | PROFONDEUR: 1
  2. | DIR: d: / Livres | TAILLE: 14.01 Mb | PROFONDEUR: 1

Cet exemple a été exécuté à 272 ms sur le disque dur.

Vous pouvez augmenter la profondeur des sous-dossiers à analyser, par exemple:

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

et obtenez des tailles non seulement pour les dossiers sélectionnés, mais également pour ses sous-dossiers

  1. | DIR: d: / go | TAILLE: 325,72 Mb | PROFONDEUR: 1
  2. | DIR: d: / go / pkg | TAILLE: 212.88 Mb | PROFONDEUR: 2
  3. | DIR: d: / go / src | TAILLE: 62,57 Mb | PROFONDEUR: 2
  4. | DIR: d: / go / bin | TAILLE: 30,44 Mb | PROFONDEUR: 2
  5. | DIR: d: / Livres / Échecs | TAILLE: 14.01 Mb | PROFONDEUR: 2
  6. | DIR: d: / Livres | TAILLE: 14.01 Mb | PROFONDEUR: 1
  7. | DIR: d: / go / api | TAILLE: 6,41 Mb | PROFONDEUR: 2
  8. | DIR: d: / go / test | TAILLE: 5,11 Mb | PROFONDEUR: 2
  9. | DIR: d: / go / doc | TAILLE: 4,00 Mb | PROFONDEUR: 2
 10. | DIR: d: / go / misc | TAILLE: 3,82 Mb | PROFONDEUR: 2
 11. | DIR: d: / go / lib | TAILLE: 358.25 Kb | PROFONDEUR: 2

* 3,5 To sur le serveur ont été scannés pendant 3 min 12 s

Alexandre Anufriev
la source
Nouvelle version publiée! github.com/aleksaan/diskusage Améliorations : 1) travail correct avec les tailles du lien symbolique 2) informations orevall sur les objets analysés
Alexander Anufriev
La version 2.0.2 est sortie! github.com/aleksaan/diskusage/releases/tag/v2.0.2 - Fichier de configuration à la place des paramètres en ligne - Mode d'utilisation simple (copiez l'exécutable diskusage dans n'importe quel dossier, exécutez-le et obtenez les résultats) - Sortie des résultats correcte (symbole de fin de ligne correct win / unix) - Enregistrer les résultats dans un fichier ou les obtenir en mode console (option 'tofile')
Alexander Anufriev
Veuillez noter que vous êtes un auteur. (De stackoverflow.com/help/promotion : "Cependant, vous devez divulguer votre affiliation dans vos réponses." )
aeracode
6

Voici un code PowerShell que j'écris pour lister la taille et le nombre de fichiers pour tous les dossiers du répertoire courant. N'hésitez pas à réutiliser ou à modifier selon vos besoins.

$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
la source
Travaille pour moi. Utile si vous êtes sur un serveur sans tête.
andrew pate
Simple et élégant! Ma version: $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}} } Cela fournira des objets (plus Powershell-ish), 'FileCount' et 'Size' sont des entiers (vous pouvez donc les traiter plus tard, si nécessaire), et 'Size' est en octets, mais vous pouvez facilement le convertir en GB (ou l'unité de votre choix) avec $Data.Size / 1GB.
curropar
Ou 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

Ce code est testé. Vous pouvez le vérifier à nouveau.

@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
la source
Merci, cela fonctionne pour moi avec des dossiers inférieurs à 1 Go, mais par exemple, j'ai un dossier de 3 976 317 115 octets (3,70 Go), et le script me renvoie cette chaîne ") 932", savez-vous pourquoi?
elady
2

Je suppose que cela ne fonctionnerait que si le répertoire est assez statique et que son contenu ne change pas entre l'exécution des deux commandes dir. Peut-être un moyen de combiner cela en une seule commande pour éviter cela, mais cela a fonctionné dans mon but (je ne voulais pas la liste complète; juste le résumé).

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%

Usage:

GetDirSummary.bat c: \ temp

Production:

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

J'ai eu du.exema distribution git. Un autre endroit pourrait être Microsoft ou Unxutils susmentionné .

Une fois que vous avez du.exe dans votre chemin. Voici votre 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
la source
1

Je pense que votre seule option sera diruse (une solution tierce hautement prise en charge):

Obtenir la taille du fichier / répertoire à partir de la ligne de commande

La CLI Windows est malheureusement assez restrictive, vous pouvez également installer Cygwin qui est un rêve à utiliser par rapport à cmd. Cela vous donnerait accès à l'outil Unix porté du qui est la base de diruse sous Windows.

Désolé, je n'ai pas pu répondre directement à vos questions avec une commande que vous pouvez exécuter sur le cli natif.

Illizian
la source
1
Si vous avez juste besoin, duCygwin est bien exagéré. Allez simplement avec GnuWin32 .
Joey
2
En effet, c'est exagéré, mais c'est aussi génial. +1 pour votre message ci-dessus @joey (je n'ai pas le représentant pour le faire littéralement :()
Illizian
À mon humble avis, Cygwin peut être utile à certains, mais c'est loin d'être génial et plutôt horrible. Mais je suppose que les utilisateurs d'Unix disent la même chose de Wine.
Joey
1
"wine" - frisson, j'utilise Cygwin sur mon ordinateur portable de développement car l'autonomie de la batterie est épouvantable sous Linux et il n'est pas pratique d'exécuter une VM dessus. Cela prend un peu de configuration, mais Cygwin est génial pour ceux d'entre nous qui manquent le shell nix dans Windows, personnellement, je n'aime pas Powershell, je devrai peut-être vérifier GnuWin. Merci @Joey.
Illizian
1

:: Récupère le nombre de lignes renvoyées par les commandes Dir (/ -c pour éliminer les séparateurs de nombres:.,) ["Tokens = 3" pour ne regarder que la troisième colonne de chaque ligne dans Dir]

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

Numéro de l'avant-dernière ligne, où est le nombre d'octets de la somme des fichiers:

set /a line=%i%-1

Enfin, récupérez le nombre d'octets dans l'avant-dernière ligne - 3e colonne:

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%

Comme il n'utilise pas de recherche de mots, il n'y aura pas de problèmes de langue.

Limites:

  • Fonctionne uniquement avec les dossiers de moins de 2 Go (cmd ne gère pas les nombres de plus de 32 bits)
  • Ne lit pas le nombre d'octets des dossiers internes.
Gustavo Davico
la source
1

Essayer:

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

Remplacez C: \ Program Files par le dossier de votre choix et changez% A en %% A si vous l'utilisez dans un fichier batch

Il renvoie la taille de tout le dossier, y compris les sous-dossiers et les fichiers cachés et système, et fonctionne avec les dossiers de plus de 2 Go

Il écrit à l'écran, vous devrez donc utiliser un fichier provisoire si vous ne le souhaitez pas.

FrinkTheBrave
la source
1

Le script suivant peut être utilisé pour récupérer et accumuler la taille de chaque fichier dans un dossier donné.
Le chemin du dossier %folder%peut être donné comme argument à ce script ( %1).
En fin de compte, les résultats sont conservés dans le paramètre%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

Remarque: La méthode calcAccSizepeut également imprimer le contenu du dossier (commenté dans l'exemple ci-dessus)

Lior Kirshner
la source
1

Voici donc une solution pour vos deux demandes de la manière que vous aviez initialement demandée. Cela donnera une taille de fichier de lisibilité humaine sans les limites de taille de fichier que tout le monde connaît. Compatible avec Win Vista ou plus récent. XP uniquement disponible si Robocopy est installé. Déposez simplement un dossier sur ce fichier de commandes ou utilisez la meilleure méthode mentionnée ci-dessous.

@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

Pour pouvoir utiliser ce fichier de commandes, placez-le dans votre dossier SendTo. Cela vous permettra de faire un clic droit sur un dossier ou une sélection de dossiers, de cliquer sur l'option Envoyer à, puis de sélectionner ce fichier de commandes.

Pour trouver le dossier SendTo sur votre ordinateur, le moyen le plus simple est d'ouvrir cmd, puis de copier cette ligne telle quelle.

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

Jules Verne
la source
Pour toute personne inquiète, Robocopy déplacera des fichiers. l'option / l répertorie uniquement. De plus, Robocopy n'est pas une tierce partie, Robocopy est installé dans Windows par défaut à partir de Vista, XP vous devez l'installer.
julesverne
Merci pour l'ajout. Heureux de voir que ce fil attire toujours l'attention ;-) Pourrait vouloir ajouter comment installer robocopy (excellent outil!).
Eldad Assis
0

J'ai résolu un problème similaire. Certaines méthodes de cette page sont lentes et certaines sont problématiques dans un environnement multilingue (toutes supposent l'anglais). J'ai trouvé une solution de contournement simple en utilisant vbscript dans cmd. Il est testé dans W2012R2 et 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))

Il définit la variable d'environnement S_. Vous pouvez, bien sûr, changer la dernière ligne pour afficher directement le résultat par exemple

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

Vous pouvez l'utiliser comme sous-programme ou comme cmd autonome. Le paramètre est le nom du dossier testé fermé entre guillemets.

arpi
la source
-3

La méthode la plus simple pour obtenir uniquement la taille totale est PowerShell, mais elle est toujours limitée par le fait que les noms de chemin de plus de 260 caractères ne sont pas inclus dans le total.

rayon
la source
2
C'est une mauvaise et une mauvaise réponse. Qu'est-ce que la ligne de commande ou le code?
Tatarin