programing

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

oldcodes 2023. 4. 14. 22:04
반응형

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

Windows에서 서드파티 툴을 사용하지 않고 명령줄에서 폴더 크기를 가져올 수 있습니까?

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

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

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

은 몇 . 왜냐하면 그것은 '이러다'이기 때문입니다.cmd는 32비트 부호 있는 정수 산술로 제한됩니다.그래서 2GiB가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 라이브러리가 있습니다.정말 발매해야 할 것 같아요:-)

이를 위한 Windows 툴이 내장되어 있습니다.

dir /s 'FolderName'

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

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

가 있는 " " 를 추가합니다./a.

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"

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

Microsoft가 제공하는 Sysinternals Suite에서 유틸리티 DU를 다운로드할 것을 권장합니다.이 링크는 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

그 사이에, 다른 유틸리티도 봐 주세요.Windows Professional이라면 누구나 안심하고 사용할 수 있습니다.

되어 있는 더 ) MINGW32를 du folder

현재 디렉토리의 모든 폴더에 대한 크기 및 파일 수를 나열하기 위해 작성한 파워셸 코드가 나타납니다.필요에 따라 자유롭게 재사용 또는 수정하십시오.

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

제가 작성한 https://github.com/aleksaan/diskusage 유틸리티를 사용하는 것을 추천합니다.매우 심플하고 도움이 됩니다.그리고 매우 빠르다.

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

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

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

1. | DIR : d : / go | SIZE : 325.72 Mb | 깊이 : 12. | DIR : d : / Books | 사이즈 : 14.01 Mb | 깊이 : 1

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

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

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

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

1. | DIR : d : / go | SIZE : 325.72 Mb | 깊이 : 12. | DIR : d : / go / pkg | 사이즈 : 212.88 Mb | 깊이 : 23.| DIR: d:/go/src | 사이즈: 62.57 Mb | 깊이: 24. | DIR : d : / go / bin | 사이즈 : 30.44 Mb | 깊이 : 25. | DIR : d : / Books / Ches | 사이즈 : 14.01 Mb | 깊이 :6. | DIR : d : / Books | 사이즈 : 14.01 Mb | 깊이 :7 . | DIR : d : / go / api | 사이즈 : 6.41 Mb | 깊이 : 28 . | DIR : d : / go / test | 사이즈 : 5.11 Mb | 깊이 : 29.| DIR: d:/go/doc | 사이즈: 4.00 Mb | 깊이: 210 . | DIR : d : / go / misc | 사이즈 : 3.82 Mb | 깊이 : 211.| DIR: d:/go/lib | 사이즈: 358.25Kb | 깊이: 2

*** 서버의 3.5 Tb에서 3m12s 스캔 완료**

이것은 디렉토리가 상당히 정적이고 두 개의 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

이 코드는 테스트 완료입니다.다시 확인하실 수 있습니다.

@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

시험:

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 이상의 폴더와 함께 작동합니다.

화면에 쓸 수 있기 때문에 원하지 않으면 중간 파일을 사용해야 합니다.

다음 한 줄로 폴더 크기를 결정할 수 있습니다.

게시물은 Github Actions 형식이며 사용되는 셸 유형을 나타냅니다.

shell: pwsh
run: |
  Get-ChildItem -Path C:\temp -Recurse | Measure-Object -Sum Length


shell: cmd
run: |
  powershell -noprofile -command "'{0:N0}' -f (ls C:\temp -r | measure -s Length).Sum"

Windows CMD를 열고 follow 명령을 실행합니다.

dir /s c:\windows

du.exe내 git 분배로.그 외의 장소에는, 상기의 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는 매우 제한적입니다.Cygwin을 설치할 수도 있습니다.Cygwin은 cmd에 비해 사용하는 것이 이상적입니다.그러면 Windows에서 기본이 되는 Ported Unix Tool du에 액세스할 수 있습니다.

네이티브 CLI에서 실행할 수 있는 명령어로 질문에 직접 답변하지 못해 죄송합니다.

::Dir 명령이 반환하는 여러 줄을 가져옵니다(숫자 구분 기호를 제거하기 위해 -c). [Dir에서 각 줄의 세 번째 열만 보려면 "토큰 = 3").

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비트 이상의 수를 처리하지 않음)
  • 내부 폴더의 바이트 수를 읽지 않습니다.

다음 스크립트를 사용하여 지정된 폴더에 있는 각 파일의 크기를 가져오고 축적할 수 있습니다.
폴더 경로%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

사용하는 것이 좋다du간단하고 일관성이 있기 때문입니다.

스쿱 설치:iwr -useb get.scoop.sh | iex

busybox 설치:scoop install busybox

get dir size:du -d 0 . -h

오늘 4/27/22에 이 페이지를 방문하여 SysInternals의 DU(https://learn.microsoft.com/en-us/sysinternals/downloads/du) 및 출력 배관 등)를 사용해 보았습니다.'VBScript로 해야 되는 거 아니야?ISOroot 폴더와 모든 하위 폴더의 전체 크기에 대해 작동하도록 했습니다.폴더 전체 경로를 자신의 경로로 바꿉니다.굉장히 빨라요.

Get Folder Size.vbs

 Dim fs, f, s
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.GetFolder("C:\XPE\Custom\x64\IsoRoot")
    s = UCase(f.Name) & " uses " & f.size & " bytes."
    MsgBox s, 0, "Folder Size Info"

s=  FormatNumber(f.size/1024000,2) & " MB"
    MsgBox s, 0, "Folder Size Info"

s=  FormatNumber(f.size/1073741824,2) & " GB"
    MsgBox s, 0, "Folder Size Info"

Windows Robocopy 를 사용합니다.

이것을 배치 파일에 넣습니다.

@echo off
pushd "%~dp0"
set dir="C:\Temp"
for /f "tokens=3" %%i in ('robocopy /l /e /bytes %dir% %dir% ^| findstr Bytes') do @echo %%i
pause

를 설정해 주세요.dir★★★★★★ 。

for은 loop을 사용하여 세 .tokens=3 명령어robocopy findstr의

/l실행되지 robocopy switch는 실행하지 .

/e in robocopy는 빈 디렉토리.switch in robocopy를 포함한 를 복사합니다.

/bytes in robocopy는 빈 디렉토리.switch in robocopy를 포함한 를 복사합니다.
you you you 、 you 、 the 、 the 、 the 、 the 、 the 、 the 。/bytesKB, MB, GB...)에누리하다

findstr | Bytes명령어는 전체 폴더 크기를 포함하는 robocopy 명령어의 출력을 검색합니다.

마지막으로 .%%i콘솔로 이동합니다.

폴더 크기를 변수에 저장해야 하는 경우 바꾸기

do @echo %%i

와 함께

set size=%%i

클립보드를 통해 폴더 크기를 다른 프로그램으로 보내려면:

echo %size% | clip

가 있는 는, 을 그 해, 삭제해 주세요.set dir="C:\Temp" 두 개 다 쓰세요.%dir%%cd%Current Directory(현재 디렉토리).

@echo off
pushd "%~dp0"
for /f "tokens=3" %%i in ('robocopy /l /e /bytes "%cd%" "%cd%" ^| findstr Bytes') do @echo %%i
pause

나는 비슷한 문제를 풀었다.이 페이지의 방법 중 일부는 느리고 일부는 다국어 환경에서 문제가 있습니다(모두 영어로 가정).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자를 초과하는 경로 이름은 전체 크기에 포함되지 않기 때문에 여전히 제한됩니다.

언급URL : https://stackoverflow.com/questions/12813826/get-folder-size-from-windows-command-line

반응형