답변:
재귀 적으로 크기를 추가 할 수 있습니다 (다음은 배치 파일입니다).
@echo off
set size=0
for /r %%x in (folder\*) do set /a size+=%%~zx
echo %size% Bytes
그러나 cmd
32 비트 부호있는 정수 산술로 제한 되기 때문에 몇 가지 문제 가 있습니다. 그래서 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 라이브러리가 있습니다. 나는 그것을 정말로 풀어 놓아야한다, 나는 추측한다 :-)
du
디렉토리 크기를 제공하지만 그것이하는 일은 트리를 걷고 요약하는 것입니다. 다음과 같은 파이프 라인에서 매우 우아하게 표현할 수있는 것 :-). 따라서 PowerShell의 경우 일반적으로 상위 수준 목표를 적절한 하위 수준 작업으로 분해하는 방법을 찾습니다.
folder\*
내가 그 자리에 넣은 폴더의 크기가 0 바이트로 표시되면 나를 위해 작동하지 않습니다. 해결 방법이 있습니까?
이를위한 기본 제공 Windows 도구 가 있습니다.
dir /s 'FolderName'
이렇게하면 불필요한 정보가 많이 인쇄되지만 끝은 다음과 같은 폴더 크기가됩니다.
Total Files Listed:
12468 File(s) 182,236,556 bytes
숨겨진 폴더를 포함해야하는 경우 /a
.
이 링크 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의 생명의 은인입니다.
\\live.sysinternals.com
여전히 존재 하는 경우 사용 ). 하지만 모든 sysinternals 도구가 기본적으로 포함되어야한다는 점에 전심으로 동의합니다. 많은 용도에서 PowerShell은 상당히 가치있는 대체품입니다.
짧막 한 농담:
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
0.00 C:\Windows
모든 폴더에 대해 최적화 할 수
ft
( Format-Table
) 작동 방식입니다. fl
대신 시도 할 수 있습니다 ( Format-List
)
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 초 동안 스캔되었습니다.
다음은 현재 디렉토리 아래의 모든 폴더에 대한 목록 크기와 파일 수를 작성하는 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
.
$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}} }
이 코드는 테스트되었습니다. 다시 확인할 수 있습니다.
@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
디렉토리가 상당히 정적이고 두 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
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
유일한 옵션은 diruse (높은 지원을받는 타사 솔루션)입니다.
Windows CLI는 매우 제한적이기 때문에 cmd에 비해 사용하는 꿈인 Cygwin 을 대신 설치할 수 있습니다. 그러면 Windows에서 diruse의 기초가되는 포팅 된 Unix 도구 du에 액세스 할 수 있습니다.
네이티브 CLI에서 실행할 수있는 명령으로 질문에 직접 답변 할 수 없었던 점 죄송합니다.
:: 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%
단어 검색을 사용하지 않기 때문에 언어 문제가 없습니다.
제한 사항 :
시험:
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 이상의 폴더에서 작동합니다.
화면에 기록하므로 원하지 않는 경우 중간 파일을 사용해야합니다.
다음 스크립트를 사용하여 주어진 폴더 아래에있는 각 파일의 크기를 가져오고 누적 할 수 있습니다.
폴더 경로 %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
는 폴더의 내용을 인쇄 할 수도 있습니다 (위의 예에서 설명 됨).
따라서 여기에 원래 요청한 방식으로 두 요청에 대한 솔루션이 있습니다. 모든 사람이 경험하는 파일 크기 제한없이 사람이 읽을 수있는 파일 크기를 제공합니다. 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
비슷한 문제를 해결했습니다. 이 페이지의 일부 방법은 느리고 일부는 다국어 환경에서 문제가 있습니다 (모두 영어로 가정). 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로 사용할 수 있습니다. 매개 변수는 따옴표로 묶인 테스트 된 폴더의 이름입니다.
전체 크기를 얻는 가장 쉬운 방법은 powershell이지만 260 자보다 긴 경로 이름은 전체에 포함되지 않는다는 사실에 의해 여전히 제한됩니다.