Windows 명령 줄에서 폴더 크기 가져 오기


128

Windows에서 타사 도구를 사용하지 않고 명령 줄에서 폴더 크기를 가져올 수 있습니까?

Windows 탐색기 → 속성에서 폴더를 마우스 오른쪽 버튼으로 클릭했을 때와 동일한 결과를 원합니다.

답변:


121

재귀 적으로 크기를 추가 할 수 있습니다 (다음은 배치 파일입니다).

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

그러나 cmd32 비트 부호있는 정수 산술로 제한 되기 때문에 몇 가지 문제 가 있습니다. 그래서 2 지브의 잘못 위의 크기를 얻을 것이다 1 . 또한 심볼릭 링크와 접합을 여러 번 계산할 가능성이 있으므로 실제 크기가 아니라 기껏해야 상한선이됩니다 (하지만 모든 도구에 문제가있을 것입니다).

대안은 PowerShell입니다.

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

이하 :

ls -r | measure -sum Length

더 예쁘게하고 싶다면 :

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

다음에서 직접 사용할 수 있습니다 cmd.

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

1 적어도 임의의 정밀도 정수 추가 권한을 얻는 배치 파일에 부분적으로 완료된 bignum 라이브러리가 있습니다. 나는 그것을 정말로 풀어 놓아야한다, 나는 추측한다 :-)


+1 그런 것을 찾기 위해 get-help * 출력을 방황하고있었습니다.
Steve

2
Steve, 내 눈에 PowerShell은 대부분의 핵심 명령이 실제로 직교한다는 점에서 Unix보다 Unix-y입니다. 유닉스에서는 du디렉토리 크기를 제공하지만 그것이하는 일은 트리를 걷고 요약하는 것입니다. 다음과 같은 파이프 라인에서 매우 우아하게 표현할 수있는 것 :-). 따라서 PowerShell의 경우 일반적으로 상위 수준 목표를 적절한 하위 수준 작업으로 분해하는 방법을 찾습니다.
Joey

3
그런 식으로 숨겨진 폴더를 무시하는 것 같습니다. ls -force -r은 숨겨진 폴더도 포함하려면 작동합니다.
garg aug.

2
folder\*내가 그 자리에 넣은 폴더의 크기가 0 바이트로 표시되면 나를 위해 작동하지 않습니다. 해결 방법이 있습니까?
IT 연구원

2
약간 더보기 좋은 버전 : powershell -noprofile -command " '{0 ​​: N0}'-f (ls -r | measure -s Length)
.Sum

120

이를위한 기본 제공 Windows 도구 가 있습니다.

dir /s 'FolderName'

이렇게하면 불필요한 정보가 많이 인쇄되지만 끝은 다음과 같은 폴더 크기가됩니다.

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

숨겨진 폴더를 포함해야하는 경우 /a.


7
정수 반환 값이 필요하지 않은 경우 가장 우아한 솔루션입니다. 참고 : '/ a'스위치는 전체 크기에 숨겨진 파일과 시스템 파일을 포함합니다.
오란 D. 주님

1
kB 또는 MB와 같은 더 유용한 단위로 파일 크기를 인쇄하는 것이 불가능하다고 생각합니다.
David Ferenczy Rogožan

작은 따옴표 대신 큰 따옴표.
user2924019

66

이 링크 http://technet.microsoft.com/en-us/sysinternals/bb896651 에서 Microsoft에서 제공하는 Sysinternals Suite에서 유틸리티 DU를 다운로드하는 것이 좋습니다.

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

당신이 그것에있는 동안 다른 유틸리티를 살펴보십시오. 모든 Windows Professional의 생명의 은인입니다.


11
"타사 도구없이"는 거의 불가능한 것 같습니다.
조이

11
아 맞다.하지만 가족을 '제 3 자'로 간주해서는 안된다고 생각했다.
Steve

1
글쎄, 당연하지만 여전히 추가 다운로드입니다 (또는 \\live.sysinternals.com여전히 존재 하는 경우 사용 ). 하지만 모든 sysinternals 도구가 기본적으로 포함되어야한다는 점에 전심으로 동의합니다. 많은 용도에서 PowerShell은 상당히 가치있는 대체품입니다.
조이

1
누군가 Powershell이라고 했습니까? 다음을 시도하십시오. "{0 : N2}"-f ((Get-ChildItem C : \ Temp -Recurse | Measure-Object -Property Length -Sum) .Sum / 1MB) + "MB"
John Homer

3
Mark Russinovich가 개발 한 모든 것을 다운로드 할 것을 권장합니다. :) 내 생명을 구하는 도구를 찾을 때마다이 이름이 계속 표시됩니다.
dkellner

46

짧막 한 농담:

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"

동일하지만 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

그러면 다음과 같은 결과가 생성됩니다.

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
기본 폴더에서도 모든 파일과 크기를 Mb로 표시하는 방법이 있습니까? 이 경우`C : \ 내 \ Tools`
Raunak 토마스

2
(드라이브는 C의 예를 들어) 게다가 폴더가 많이있을 때 나누기
Raunak 토마스

0.00 C:\Windows모든 폴더에 대해 최적화 할 수
있습니까?

이것은 좋지만 내 구성 요소 폴더 이름이 잘립니다. 전체를 표시하는 명령은 무엇입니까?
sean.net

@ sean.net 긴 폴더의 경우 "..."로 끝남을 의미합니까? 이것이 ft( Format-Table) 작동 방식입니다. fl대신 시도 할 수 있습니다 ( Format-List)
frizik

16

컴퓨터에 git이 설치되어있는 경우 (더욱 보편화 됨) MINGW32를 열고 다음을 입력하십시오. du folder


4
du -h -d 1 folder | sort -h사람이 읽을 수있는 크기, 한 수준의 하위 디렉터리 만 사용하고 크기별로 정렬하려면 다음 명령을 사용할 수 있습니다 .
vard

8

https://github.com/aleksaan/diskusage 유틸리티 를 사용하는 것이 좋습니다 . 매우 간단하고 도움이됩니다. 그리고 매우 빠릅니다.

명령 셸을 입력하기 만하면됩니다.

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

크기 별로 정렬 된 폴더 목록을 가져옵니다.

  1. | DIR : d : / go | 크기 : 325.72 Mb | 깊이 : 1
  2. | DIR : d : / Books | 크기 : 14.01 Mb | 깊이 : 1

이 예제는 HDD 에서 272ms 에서 실행되었습니다 .

분석 할 하위 폴더의 깊이를 늘릴 수 있습니다. 예를 들면 다음과 같습니다.

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

선택한 폴더뿐만 아니라 하위 폴더의 크기도 가져옵니다.

  1. | DIR : d : / go | 크기 : 325.72 Mb | 깊이 : 1
  2. | 디렉터리 : d : / go / pkg | 크기 : 212.88 Mb | 깊이 : 2
  3. | DIR : d : / go / src | 크기 : 62.57 Mb | 깊이 : 2
  4. | DIR : d : / go / bin | 크기 : 30.44 Mb | 깊이 : 2
  5. | DIR : d : / 책 / 체스 | 크기 : 14.01 Mb | 깊이 : 2
  6. | DIR : d : / Books | 크기 : 14.01 Mb | 깊이 : 1
  7. | DIR : d : / go / api | 크기 : 6.41 Mb | 깊이 : 2
  8. | DIR : d : / go / test | 크기 : 5.11 Mb | 깊이 : 2
  9. | DIR : d : / go / doc | 크기 : 4.00 Mb | 깊이 : 2
 10. | DIR : d : / go / misc | 크기 : 3.82 Mb | 깊이 : 2
 11. | 디렉터리 : d : / go / lib | 크기 : 358.25 Kb | 깊이 : 2

* 서버의 3.5Tb는 3 분 12 초 동안 스캔되었습니다.


새 버전 출시! github.com/aleksaan/diskusage Improvments : 1) 심볼릭 링크의 크기가 2 올바른 작업) 분석 개체에 대한 orevall 정보
알렉산더 아누 프리 브

버전 2.0.2 출시! github.com/aleksaan/diskusage/releases/tag/v2.0.2- 인라인 매개 변수 대신 구성 파일-단순 사용 모드 (디스크 사용 실행 파일을 임의의 폴더에 복사, 실행하고 결과 가져 오기)-올바른 결과 출력 (올바른 줄 끝 기호 win / unix)-결과를 파일에 저장하거나 콘솔 모드로 가져 오기 (옵션 'tofile')
Alexander Anufriev

당신은 저자라는 것을 명심하십시오. (
출처

6

다음은 현재 디렉토리 아래의 모든 폴더에 대한 목록 크기와 파일 수를 작성하는 powershell 코드입니다. 필요에 따라 자유롭게 재사용하거나 수정할 수 있습니다.

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

나를 위해 작동합니다. 헤드리스 서버에서 유용합니다.
앤드류 머리

간단하고 우아합니다! 내 버전 : $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}} } 이것은 객체 (더 많은 Powershell-ish)를 제공하고, 'FileCount'및 'Size'는 정수 (필요한 경우 나중에 처리 할 수 ​​있음)이며 'Size'는 바이트 단위이지만 쉽게 변환 할 수 있습니다. GB (또는 원하는 단위)를 $Data.Size / 1GB.
curropar

또는 한 줄짜리 :$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

이 코드는 테스트되었습니다. 다시 확인할 수 있습니다.

@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

감사합니다. 1GB보다 작은 폴더에서도 작동하지만 예를 들어 3,976,317,115 바이트 (3.70GB)의 폴더가 있고 스크립트가이 문자열 ") 932"를 반환합니다. 그 이유를 알고 있습니까?
elady

2

디렉토리가 상당히 정적이고 두 dir 명령 실행 사이에 내용이 변경되지 않는 경우에만 작동 할 것이라고 생각합니다. 이를 피하기 위해 이것을 하나의 명령으로 결합하는 방법 일 수도 있지만 이것은 내 목적에 맞았습니다 (전체 목록을 원하지 않았고 요약 만).

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%

용법:

GetDirSummary.bat c : \ temp

산출:

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

1

du.exe내 자식 배포판을 얻었 습니다. 다른 곳은 앞서 언급 한 Microsoft 또는 Unxutils 일 수 있습니다 .

경로에 du.exe가 있으면. 여기에 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

유일한 옵션은 diruse (높은 지원을받는 타사 솔루션)입니다.

명령 줄에서 파일 / 디렉터리 크기 가져 오기

Windows CLI는 매우 제한적이기 때문에 cmd에 비해 사용하는 꿈인 Cygwin 을 대신 설치할 수 있습니다. 그러면 Windows에서 diruse의 기초가되는 포팅 된 Unix 도구 du에 액세스 할 수 있습니다.

네이티브 CLI에서 실행할 수있는 명령으로 질문에 직접 답변 할 수 없었던 점 죄송합니다.


1
필요한 du경우 Cygwin은 너무 과잉입니다. GnuWin32 로 가십시오 .
조이

2
실제로 그것은 과잉이지만 또한 굉장합니다. @joey 위 게시물에 대한 +1 (:( 문자 그대로을 수행 할 담당자를 가지고하지 않은 경우)
Illizian

내 겸손한 견해로는 Cygwin이 일부에게는 유용 할 수 있지만 굉장하고 끔찍한 것과는 거리가 멀다. 하지만 유닉스 사용자들이 Wine에 대해 똑같이 말하는 것 같아요.
조이

1
"와인"-떨려요. Linux에서는 배터리 수명이 끔찍하고 VM을 실행하는 것이 편리하지 않기 때문에 개발 용 노트북에서 Cygwin을 사용합니다. 약간의 설정이 필요하지만 Cygwin은 Windows에서 nix 셸을 놓친 사람들에게 훌륭합니다. 개인적으로 Powershell을 좋아하지 않지만 GnuWin을 확인해야 할 수도 있습니다. 감사합니다 @Joey.
Illizian 2012

1

:: Dir 명령이 반환하는 줄 수를 가져옵니다 (숫자 구분 기호를 제거하려면 / -c :.,) [ "Tokens = 3": Dir 각 줄의 세 번째 열만 확인]

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

두 번째 줄의 번호입니다. 여기서은 파일 합계의 바이트 수입니다.

set /a line=%i%-1

마지막으로 두 번째 줄-세 번째 열의 바이트 수를 가져옵니다.

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%

단어 검색을 사용하지 않기 때문에 언어 문제가 없습니다.

제한 사항 :

  • 2GB 미만의 폴더에서만 작동합니다 (cmd는 32 비트 이상의 수를 처리하지 않음).
  • 내부 폴더의 바이트 수를 읽지 않습니다.

1

시험:

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

C : \ Program Files를 원하는 폴더로 변경하고 배치 파일에서 사용하는 경우 % A를 %% A로 변경합니다.

하위 폴더와 숨김 및 시스템 파일을 포함한 전체 폴더의 크기를 반환하며 2GB 이상의 폴더에서 작동합니다.

화면에 기록하므로 원하지 않는 경우 중간 파일을 사용해야합니다.


1

다음 스크립트를 사용하여 주어진 폴더 아래에있는 각 파일의 크기를 가져오고 누적 할 수 있습니다.
폴더 경로 %folder%는이 스크립트에 대한 인수로 제공 될 수 있습니다 ( %1).
궁극적으로 결과는 매개 변수에 보관됩니다.%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

참고 :이 메서드 calcAccSize는 폴더의 내용을 인쇄 할 수도 있습니다 (위의 예에서 설명 됨).


1

따라서 여기에 원래 요청한 방식으로 두 요청에 대한 솔루션이 있습니다. 모든 사람이 경험하는 파일 크기 제한없이 사람이 읽을 수있는 파일 크기를 제공합니다. Win Vista 이상과 호환됩니다. XP는 Robocopy가 설치된 경우에만 사용할 수 있습니다. 이 배치 파일에 폴더를 놓거나 아래에 언급 된 더 나은 방법을 사용하십시오.

@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

이 배치 파일을 편리하게 사용하려면 SendTo 폴더에 넣으십시오. 이렇게하면 폴더 또는 폴더 선택을 마우스 오른쪽 단추로 클릭하고 SendTo 옵션을 클릭 한 다음이 배치 파일을 선택할 수 있습니다.

컴퓨터에서 SendTo 폴더를 찾는 가장 간단한 방법은 cmd를 열고이 줄을있는 그대로 복사하는 것입니다.

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


Robocopy가 파일을 이동시킬 것이라고 걱정하는 사람을 위해 ..하지 마십시오. / l 옵션은 목록 만 나열합니다. 또한 Robocopy는 타사가 아니며 Robocopy는 Windows Vista에서 기본적으로 설치되며 XP를 설치해야합니다.
julesverne

추가해 주셔서 감사합니다. 이 스레드가 여전히 주목을 받고있는 것을보고 다행입니다 ;-) robocopy를 설치하는 방법을 추가하고 싶을 수도 있습니다 (훌륭한 도구!).
Eldad Assis

0

비슷한 문제를 해결했습니다. 이 페이지의 일부 방법은 느리고 일부는 다국어 환경에서 문제가 있습니다 (모두 영어로 가정). cmd에서 vbscript를 사용하여 간단한 해결 방법을 찾았습니다. W2012R2 및 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))

환경 변수 S_를 설정합니다. 물론 결과를 직접 표시하기 위해 마지막 줄을 변경할 수 있습니다.

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

서브 루틴 또는 독립형 cmd로 사용할 수 있습니다. 매개 변수는 따옴표로 묶인 테스트 된 폴더의 이름입니다.


-3

전체 크기를 얻는 가장 쉬운 방법은 powershell이지만 260 자보다 긴 경로 이름은 전체에 포함되지 않는다는 사실에 의해 여전히 제한됩니다.


2
이것은 나쁘고 잘못된 대답입니다. 명령 줄 또는 코드는 무엇입니까?
Tatarin 2015-08-11
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.