PowerShell에서 빈 폴더 삭제하는 방법

효과적인 디렉토리 관리는 PowerShell 스크립팅에서 필수적이며, Get-ChildItem
cmdlet은 파일 시스템 탐색의 핵심 역할을 합니다. 빈 폴더를 정리하는 작업을 할 때 폴더 계층을 탐색하는 것이 중요해집니다.
이 문서에서는 Get-ChildItem
및 다른 cmdlet을 활용하여 지정된 경로 내에서 빈 디렉토리를 체계적으로 식별하고 제거하는 실용적인 사용법을 다룹니다. PowerShell의 강력한 스크립팅 기능을 활용하여 사용자는 효율적으로 디렉토리를 관리하고 정리된 파일 시스템을 유지할 수 있습니다.
PowerShell의 Get-ChildItem
Cmdlet
Get-ChildItem
cmdlet은 지정된 위치의 모든 자식 항목(파일 및 폴더)을 검색합니다. 주어진 폴더 경로 내의 모든 빈 폴더를 삭제해야 할 필요가 있을 때, 폴더 계층을 탐색하는 것이 필수입니다.
따라서 Get-ChildItem
cmdlet이 유용할 것입니다. 이 cmdlet은 디렉토리 타입의 자식 항목을 가져오고 폴더 구조를 재귀적으로 탐색하기 위해 Recurse
및 Directory
와 같은 매개변수를 허용합니다.
구문:
powershellCopyGet-ChildItem -Path -Directory -Recurse
사용할 수 있는 추가 선택적 매개변수가 많이 있습니다. 다음과 같이 폴더 구조를 생성해 봅시다.
textCopysomepath/testA
testB
testD
testE
a.txt
testC
testF
b.txt
testG
testH
목적은 testA
폴더 내의 모든 빈 폴더를 제거하는 것입니다. 따라서 다음 폴더를 삭제해야 합니다.
testD
testG
testH
주어진 폴더 경로(somepath/testA
)에 있는 모든 하위 디렉토리를 가져옵니다.
powershellCopy$path = "D:\testA"
$fetchedDirList = Get-ChildItem $path -Directory -Recurse
이 코드 조각에서는 $path
변수에 디렉토리 경로 "D:\testA"
을 할당하고, Get-ChildItem
cmdlet을 -Directory
와 -Recurse
매개변수와 함께 사용하여 지정된 경로에서 디렉토리를 재귀적으로 가져옵니다. 결과적으로 생성된 디렉토리 목록은 $fetchedDirList
변수에 저장되어, "D:\testA"
및 그 하위 디렉토리 내의 모든 디렉토리를 나타내는 디렉토리 객체 모음이 됩니다.
Get-ChildItem
대신 별칭 gci
를 사용할 수 있습니다.
powershellCopy$fetchedDirList = gci $path -directory -Recurse
원래 코드에서 수정된 버전으로 전환하면서, 우리는 여전히 Get-ChildItem
cmdlet을 사용하여 검색한 디렉토리 객체를 변수 $fetchedDirList
에 저장합니다. 그러나 이 업데이트된 코드에서는 전체 cmdlet 이름 Get-ChildItem
대신 별칭 gci
를 사용합니다.
이 간편 표현은 지정된 경로 $path
에서 디렉토리를 재귀적으로 가져와 $fetchedDirList
에 저장하는 기능을 유지합니다.
$fetchedDirList
변수를 확인해봅시다.
powershellCopy$fetchedDirList
출력:
모든 디렉토리와 하위 디렉토리가 예상대로 가져와졌습니다.
PowerShell의 Where-Object
Cmdlet
우리는 위의 결과에서 빈 디렉토리를 필터링할 필요가 있습니다. Where-Object
cmdlet은 컬렉션에서 객체를 그 속성에 따라 필터링합니다.
Where
별칭을 Where-Object
명령어 대신 사용할 수 있습니다. 우리는 각 디렉토리 내의 항목 수를 기반으로 위의 디렉토리 목록을 필터링해야 합니다.
조건은 다음과 같이 표시됩니다.
powershellCopywhere { (gci $_.fullName).count -eq 0 }
컬렉션에서 주어진 객체가 0개의 하위 항목을 가질 때, 그것은 빈 디렉토리로 간주됩니다. 따라서 우리는 그것을 삭제해야 합니다.
이전 단계의 출력을 Where
cmdlet으로 파이핑해봅시다.
powershellCopy$emptyDirectoryList = $fetchedDirList | where { (gci $_.fullName).count -eq 0 }
이 코드 라인에서는 $emptyDirectoryList
변수에 $fetchedDirList
에서 디렉토리를 Where
별칭을 사용하여 필터링한 결과를 할당합니다. 스크립트 블록 내에 정의된 필터링 조건은 각 디렉토리 내의 자식 항목 수(gci $_.FullName
로 검색된)가 0인지 확인합니다.
이 접근 방식은 빈 디렉토리를 나타내는 디렉토리 객체만을 효과적으로 식별하고 $emptyDirectoryList
에 캡처합니다.
$emptyDirectoryList
를 출력해봅시다.
powershellCopy$emptyDirectoryList
출력:
결과가 완벽히 올바릅니다. 우리는 빈 내용의 testD
와 testH
라는 두 개의 폴더만 가졌습니다.
우리는 $emptyDirectoryList
컬렉션에서 각 객체를 쉽게 삭제할 수 있습니다. Remove-Item
cmdlet을 사용하여 항목을 삭제할 수 있습니다.
그 전에 우리는 $emptyDirectoryList
내부의 각 객체의 전체 경로를 가져와야 합니다. Select-Object
cmdlet은 FullName
속성과 함께 객체를 가져올 수 있습니다.
powershellCopy$finalListToRemove = $emptyDirectoryList | select -ExpandProperty FullName
이 코드 라인에서는 $emptyDirectoryList
에 저장된 디렉토리의 전체 경로를 추출하여 새로운 변수 $finalListToRemove
를 만듭니다. 우리는 Select-Object
cmdlet을 -ExpandProperty FullName
매개변수와 함께 사용하여 $emptyDirectoryList
내의 각 디렉토리 객체에 대한 FullName
속성의 값을 가져옵니다.
결과적으로 $finalListToRemove
는 빈 디렉토리에 대한 전체 경로 목록을 포함하게 되어 제거할 준비가 됩니다.
powershellCopy$finalListToRemove
$finalListToRemove
의 출력:
이제 우리는 제거할 폴더 목록을 갖게 되었습니다.
PowerShell에서 컬렉션에서 항목 삭제하기
컬렉션의 항목을 반복하기 위해 ForEach-Object
cmdlet을 사용할 수 있습니다. 루프 내에서 Remove-Item
cmdlet을 사용할 수 있습니다.
powershellCopy$finalListToRemove | ForEach-Object { Remove-Item $_ }
$_
는 컬렉션의 현재 항목을 나타냅니다. 이 코드는 testD
와 testH
폴더를 삭제합니다.
여기에서 주의해야 할 부분이 있습니다. testH
폴더가 삭제될 때 testG
디렉토리도 비게 됩니다.
따라서 우리는 스크립트를 약간 수정해야 합니다. 우리는 비어있지 않은 폴더가 남을 때까지 위의 절차를 계속 실행해야 합니다.
이를 위해 do...while
루프를 사용할 수 있습니다.
powershellCopy$path = "D:\testA"
do {
$fetchedDirList = Get-ChildItem $path -Directory -Recurse
$emptyDirectoryList = $fetchedDirList | where { (gci $_.fullName).count -eq 0 }
$finalListToRemove = $emptyDirectoryList | select -ExpandProperty FullName
$finalListToRemove | ForEach-Object { Remove-Item $_ }
} while ( $finalListToRemove.count -gt 0 )
이 코드 블록에서는 지정된 경로 및 그 하위 디렉토리 내에서 빈 디렉토리를 체계적으로 감지하고 삭제하는 루프를 설정합니다. 루프 내에서 먼저 우리는 Get-ChildItem
cmdlet을 사용하여 지정된 경로에서 재귀적으로 모든 디렉토리를 가져옵니다.
그런 다음 Where-Object
cmdlet을 사용하여 빈 디렉토리를 필터링합니다. 이 빈 디렉토리의 전체 경로를 추출한 후, 우리는 ForEach-Object
루프 내에서 하나씩 제거하기 위해 Remove-Item
cmdlet을 사용합니다.
이 루프는 제거할 빈 디렉토리가 남아 있는 한 반복하여 지정된 경로 및 그 하위 디렉토리 내의 빈 디렉토리를 철저히 정리합니다.
숨겨진 파일과 폴더를 고려해야 할 경우, 다음과 같이 Get-ChildItem
cmdlet에 -Force
매개변수를 전달할 수 있습니다.
powershellCopy$emptyDirectoryList = $fetchedDirList | where { (gci $_.fullName -Force).count -eq 0 }
출력:
결론
PowerShell에서 빈 폴더를 효율적으로 식별하고 제거하는 것은 정리된 파일 시스템을 유지하기 위해 매우 중요합니다. Get-ChildItem
, Where-Object
, 및 Remove-Item
와 같은 cmdlet의 전략적 활용을 통해 사용자는 디렉토리 관리 작업을 간소화할 수 있습니다.
이 cmdlet들은 지정된 경로 내에서의 디렉토리의 포괄적인 정리를 가능하게 하여 시스템의 효율성과 조직성을 강화합니다. PowerShell의 스크립팅 환경을 활용하여 사용자는 디렉토리 관리 프로세스를 자동화할 수 있으며, 시간과 노력을 절약하면서 정리된 파일 시스템을 보장할 수 있습니다.
PowerShell의 강력한 기능으로 인해 디렉토리 관리는 시스템 관리의 원활한 측면이 되며, 사용자가 최적의 시스템 성능을 유지할 수 있도록 지원합니다.
Nimesha is a Full-stack Software Engineer for more than five years, he loves technology, as technology has the power to solve our many problems within just a minute. He have been contributing to various projects over the last 5+ years and working with almost all the so-called 03 tiers(DB, M-Tier, and Client). Recently, he has started working with DevOps technologies such as Azure administration, Kubernetes, Terraform automation, and Bash scripting as well.