PowerShell로 폴더 크기를 확인해야 하는 이유
대부분의 Windows 사용자는 파일 탐색기에서 폴더 속성 창을 열어 폴더 크기를 확인하는 것이 가장 간단한 방법이라는 점을 알고 있습니다. 좀 더 경험이 많은 사용자라면 TreeSize나 WinDirStat 같은 서드파티 도구를 즐겨 사용하죠. 그러나 특정 디렉터리에 있는 폴더들의 상세한 크기 통계를 얻거나 특정 파일 형식을 제외한 결과가 필요하다면 PowerShell 기능을 활용하는 편이 훨씬 유용합니다. 이번 글에서는 PowerShell을 이용해 디스크상의 특정 폴더와 모든 하위 폴더의 크기를 빠르게 구하는 방법을 살펴보겠습니다.
Get-ChildItem과 Measure-Object cmdlet 활용
PowerShell에서는 Get-ChildItem(별칭 gci)과 Measure-Object(별칭 measure) cmdlet을 조합하여 파일과 폴더(하위 폴더 포함)의 크기를 구할 수 있습니다. 첫 번째 cmdlet은 지정된 조건에 따라 해당 디렉터리의 파일 목록(크기 포함)을 가져오고, 두 번째 cmdlet은 산술 연산을 수행합니다.
팁. 이전 글에서는 Get-ChildItem cmdlet을 사용해 디스크에서 가장 큰 파일을 찾는 방법을 다룬 적이 있습니다.
예를 들어 C:\ISO 폴더의 크기를 구하려면 다음 명령을 실행합니다.
Get-ChildItem C:\ISO | Measure-Object -Property Length -sum
실행 결과에서 볼 수 있듯이 해당 디렉터리에 있는 파일의 총 크기는 Sum 필드에 표시되며 약 2.1GB입니다(크기는 바이트 단위로 표시됩니다).
MB·GB 단위로 변환하고 소수점 자릿수 지정하기
크기를 더 읽기 쉬운 MB 또는 GB 단위로 변환하려면 다음 명령을 사용하세요.
(gci c:\iso | measure Length -s).sum / 1Gb
또는:
(gci c:\iso | measure Length -s).sum / 1Mb
결과를 소수점 둘째 자리까지 반올림하려면 아래 명령을 실행합니다.
"{0:N2} GB" -f ((gci c:\iso | measure Length -s).sum / 1Gb)
특정 확장자 파일만 합산하기
PowerShell을 사용하면 디렉터리 안에서 특정 형식의 파일만 골라 총 크기를 계산할 수도 있습니다. 예를 들어 폴더 안의 모든 ISO 파일의 총 크기를 구하려면 다음과 같이 입력합니다.
(gci c:\iso *.iso | measure Length -s).sum / 1Mb
하위 폴더까지 포함해 크기 계산하기
앞서 소개한 명령은 지정한 디렉터리에 있는 파일의 총 크기만 구합니다. 디렉터리에 하위 폴더가 있으면 하위 폴더의 파일 크기는 계산되지 않습니다. 하위 디렉터리까지 포함한 총 크기를 구하려면 -Recurse 매개변수를 사용하세요. 예를 들어 C:\Windows 폴더의 총 크기를 구해 보겠습니다.
"{0:N2} GB" -f ((gci –force c:\Windows –Recurse -ErrorAction SilentlyContinue| measure Length -s).sum / 1Gb)
숨김 파일과 시스템 파일의 크기까지 포함시키기 위해 -force 인자도 함께 사용했습니다.
결과적으로 제 로컬 드라이브의 C:\Windows 크기는 약 40GB입니다(스크립트는 NTFS 압축은 무시합니다).
팁. 디렉터리 접근 오류(PermissionDenied → DirUnauthorizedAccessError)를 방지하려면 -ErrorAction SilentlyContinue 매개변수를 사용하세요.
하드 링크 중복 계산 문제 해결
이 스크립트는 디렉터리에 심볼릭 링크나 하드 링크가 포함되어 있으면 크기를 잘못 계산할 수 있습니다. 예를 들어 C:\Windows 폴더에는 WinSxS 폴더(Windows 구성 요소 저장소)의 파일을 가리키는 하드 링크가 많이 들어 있습니다. 그 결과 동일한 파일이 여러 번 집계될 수 있습니다. 결과에서 하드 링크를 제외하려면 다음 명령을 사용하세요(완료까지 시간이 오래 걸립니다).
"{0:N2} GB" -f ((gci –force C:\windows –Recurse -ErrorAction SilentlyContinue | Where-Object { $_.LinkType -notmatch "HardLink" }| measure Length -s).sum / 1Gb)
보시다시피 실제 Windows 폴더의 크기는 조금 더 작습니다.
생성 날짜 등 조건으로 파일 필터링하기
필터를 사용하면 최종 크기를 계산할 때 고려할 파일을 선택할 수 있습니다. 예를 들어 2020년에 생성된 파일의 크기를 구하려면 다음 명령을 사용합니다.
(gci -force c:\ps –Recurse -ErrorAction SilentlyContinue | ? {$_.CreationTime -gt '1/1/20' -AND $_.CreationTime -lt '12/31/20'}| measure Length -s).sum / 1Gb
첫 번째 수준 하위 폴더별 크기 구하기
지정한 디렉터리의 모든 1차 하위 폴더 크기를 구할 수도 있습니다. 예를 들어 C:\Users 폴더에 있는 모든 사용자 프로필의 크기를 알고 싶다면 다음 스크립트를 사용하세요.
gci -force 'C:\Users'-ErrorAction SilentlyContinue | ? { $_ -is [io.directoryinfo] } | % {
$len = 0
gci -recurse -force $_.fullname -ErrorAction SilentlyContinue | % { $len += $_.length }
$_.fullname, '{0:N2} GB' -f ($len / 1Gb)
}
여기서 %는 foreach-object 루프의 별칭입니다.
C:\ 드라이브 루트의 폴더별 크기를 표로 정리하기
조금 더 나아가 보겠습니다. 시스템 드라이브 루트에 있는 각 디렉터리의 크기를 구하고, 분석하기 좋은 표 형태로 정렬 가능하게 출력하는 것이 과제라고 가정해 봅시다.
시스템 C:\ 드라이브의 디렉터리 크기 정보를 얻으려면 다음 PowerShell 스크립트를 실행합니다.
$targetfolder='C:\'
$dataColl = @()
gci -force $targetfolder -ErrorAction SilentlyContinue | ? { $_ -is [io.directoryinfo] } | % {
$len = 0
gci -recurse -force $_.fullname -ErrorAction SilentlyContinue | % { $len += $_.length }
$foldername = $_.fullname
$foldersize= '{0:N2}' -f ($len / 1Gb)
$dataObject = New-Object PSObject
Add-Member -inputObject $dataObject -memberType NoteProperty -name “foldername” -value $foldername
Add-Member -inputObject $dataObject -memberType NoteProperty -name “foldersizeGb” -value $foldersize
$dataColl += $dataObject
}
$dataColl | Out-GridView -Title “Size of subdirectories”
실행하면 시스템 드라이브 C:\ 루트의 모든 폴더와 크기가 표시되는 그래픽 표(Out-GridView cmdlet으로 생성)가 나타납니다. 열 머리글을 클릭하면 폴더를 크기순으로 정렬할 수 있으며, 결과를 CSV(| Export-Csv folder_size.csv) 또는 Excel 파일로 내보낼 수도 있습니다.
재사용 가능한 Get-FolderSize 함수 만들기
PowerShell 스크립트에서 폴더 크기 확인 작업을 자주 사용한다면 별도의 함수로 만들어 두는 것이 좋습니다.
function Get-FolderSize {
[CmdletBinding()]
Param (
[Parameter(Mandatory=$true,ValueFromPipeline=$true)]
$Path
)
if ( (Test-Path $Path) -and (Get-Item $Path).PSIsContainer ) {
$Measure = Get-ChildItem $Path -Recurse -Force -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum
$Sum = '{0:N2}' -f ($Measure.Sum / 1Gb)
[PSCustomObject]@{
"Path" = $Path
"Size($Gb)" = $Sum
}
}
}
함수를 사용하려면 폴더 경로를 인자로 넘겨 명령을 실행하기만 하면 됩니다.
Get-FolderSize ('C:\PS')
원격 컴퓨터의 폴더 크기 확인하기
로컬에서 만든 이 PowerShell 함수는 Invoke-Command(PowerShell Remoting) cmdlet을 통해 원격 컴퓨터의 폴더 크기를 확인하는 데에도 활용할 수 있습니다.
Invoke-Command -ComputerName hq-srv01 -ScriptBlock ${Function:Get-FolderSize} –ArgumentList 'C:\PS'
이 명령들은 PowerShell Core 7.x를 포함한 모든 PowerShell 버전에서 동작합니다.