PowerShell에서 빈 폴더 삭제
이 문서에서는 PowerShell에서 빈 폴더를 삭제하는 방법을 보여줍니다.
PowerShell의 Get-ChildItem
cmdlet
Get-ChildItem
cmdlet은 지정된 위치에 대한 모든 하위 항목(파일 및 폴더)을 검색합니다. 주어진 폴더 경로에서 빈 폴더를 모두 삭제해야 하는 경우 폴더 계층 구조를 트래버스해야 합니다.
따라서 Get-ChildItem
cmdlet이 도움이 될 것입니다. 이 cmdlet은 Recurse
및 Directory
와 같은 매개 변수를 허용하여 디렉터리 유형 하위 항목을 가져오고 폴더 구조를 재귀적으로 트래버스합니다.
통사론:
Get-ChildItem -Path -Directory -Recurse
사용할 수 있는 더 많은 선택적 매개변수가 있습니다. 다음과 같이 폴더 구조를 만들어 봅시다.
somepath/testA
testB
testD
testE
a.txt
testC
testF
b.txt
testG
testH
목적은 testA
폴더 내의 모든 빈 폴더를 제거하는 것입니다. 따라서 다음 폴더를 삭제해야 합니다.
테스트D
테스트G
테스트H
주어진 폴더 경로(somepath/testA
)에서 모든 하위 디렉토리를 가져오겠습니다.
$path = "D:\testA"
$fetchedDirList = Get-ChildItem $path -directory -recurse
Get-ChildItem
대신 gci
별칭을 사용할 수 있습니다.
$fetchedDirList = gci $path -directory -recurse
$fetchedDirList
변수를 확인하겠습니다.
$fetchedDirList
출력:
모든 디렉터리와 하위 디렉터리를 예상대로 가져왔습니다.
PowerShell의 Where-Object
Cmdlet
위의 결과에서 빈 디렉터리를 필터링해야 합니다. Where-Object
cmdlet은 해당 속성을 기반으로 컬렉션에서 개체를 필터링합니다.
Where-Object
명령 대신 Where
별칭을 사용할 수 있습니다. 각 디렉터리 내의 항목 수를 기반으로 위의 디렉터리 목록을 필터링해야 합니다.
조건은 다음과 같습니다.
Where { (gci $_.fullName).count -eq 0 }
컬렉션에서 주어진 개체에 하위 항목이 0개 있으면 빈 디렉터리로 간주됩니다. 따라서 삭제해야 합니다.
이전 단계 출력을 Where
cmdlet에 연결해 보겠습니다.
$emptyDirectoryList = $fetchedDirList | Where { (gci $_.fullName).count -eq 0 }
$emptyDirectoryList
를 인쇄해 보겠습니다.
$emptyDirectoryList
출력:
결과는 완벽하게 맞습니다. 내용이 비어 있는 testD
및 testH
라는 두 개의 폴더만 있습니다.
$emptyDirectoryList
컬렉션에서 각 개체를 쉽게 삭제할 수 있습니다. Remove-Item
cmdlet을 사용하여 항목을 삭제할 수 있습니다.
그 전에 $emptyDirectoryList
에 있는 각 개체의 전체 경로를 가져와야 합니다. Select-Object
cmdlet은 FullName
속성을 사용하여 개체를 가져올 수 있습니다.
$finalListToRemove = $emptyDirectoryList | select -expandproperty FullName
$finalListToRemove
의 출력:
이제 제거할 폴더 목록을 얻었습니다.
PowerShell의 컬렉션에서 항목 삭제
ForEach-Object
cmdlet을 사용하여 컬렉션의 항목을 반복할 수 있습니다. 루프 내에서 Remove-Item
cmdlet을 사용할 수 있습니다.
$finalListToRemove | Foreach-Object { Remove-Item $_ }
$_
는 컬렉션의 현재 항목을 나타냅니다. 이렇게 하면 testD
및 testH
폴더가 삭제됩니다.
여기서 까다로운 부분이 있습니다. testH
폴더가 삭제되면 testG
디렉토리도 비게 됩니다.
따라서 스크립트를 약간 수정해야 합니다. 비어 있지 않은 폴더가 남을 때까지 위의 절차를 실행해야 합니다.
이를 위해 do...while
루프를 사용할 수 있습니다.
$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 )
여기서는 빈 폴더 목록이 0이 될 때까지 while
루프를 실행합니다. 숨김 파일 및 폴더를 고려해야 하는 경우 다음과 같이 -Force
매개 변수를 Get-ChildItem
cmdlet에 전달할 수 있습니다. 다음과 같은.
$emptyDirectoryList = $fetchedDirList | Where { (gci $_.fullName -Force).count -eq 0 }
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.