PowerShell에서 빈 폴더 삭제

Migel Hewage Nimesha 2023년6월20일
  1. PowerShell의 Get-ChildItem cmdlet
  2. PowerShell의 Where-Object Cmdlet
  3. PowerShell의 컬렉션에서 항목 삭제
PowerShell에서 빈 폴더 삭제

이 문서에서는 PowerShell에서 빈 폴더를 삭제하는 방법을 보여줍니다.

PowerShell의 Get-ChildItem cmdlet

Get-ChildItem cmdlet은 지정된 위치에 대한 모든 하위 항목(파일 및 폴더)을 검색합니다. 주어진 폴더 경로에서 빈 폴더를 모두 삭제해야 하는 경우 폴더 계층 구조를 트래버스해야 합니다.

따라서 Get-ChildItem cmdlet이 도움이 될 것입니다. 이 cmdlet은 RecurseDirectory와 같은 매개 변수를 허용하여 디렉터리 유형 하위 항목을 가져오고 폴더 구조를 재귀적으로 트래버스합니다.

통사론:

Get-ChildItem -Path -Directory -Recurse

사용할 수 있는 더 많은 선택적 매개변수가 있습니다. 다음과 같이 폴더 구조를 만들어 봅시다.

somepath/testA
			testB
				testD
				testE
					a.txt
			testC
				testF
					b.txt
				testG
					testH

목적은 testA 폴더 내의 모든 빈 폴더를 제거하는 것입니다. 따라서 다음 폴더를 삭제해야 합니다.

  1. 테스트D
  2. 테스트G
  3. 테스트H

주어진 폴더 경로(somepath/testA)에서 모든 하위 디렉토리를 가져오겠습니다.

$path = "D:\testA"
$fetchedDirList = Get-ChildItem $path -directory -recurse

Get-ChildItem 대신 gci 별칭을 사용할 수 있습니다.

$fetchedDirList = gci $path -directory -recurse

$fetchedDirList 변수를 확인하겠습니다.

$fetchedDirList

출력:

Get-ChildItem

모든 디렉터리와 하위 디렉터리를 예상대로 가져왔습니다.

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

출력:

여기서 개체

결과는 완벽하게 맞습니다. 내용이 비어 있는 testDtestH라는 두 개의 폴더만 있습니다.

$emptyDirectoryList 컬렉션에서 각 개체를 쉽게 삭제할 수 있습니다. Remove-Item cmdlet을 사용하여 항목을 삭제할 수 있습니다.

그 전에 $emptyDirectoryList에 있는 각 개체의 전체 경로를 가져와야 합니다. Select-Object cmdlet은 FullName 속성을 사용하여 개체를 가져올 수 있습니다.

$finalListToRemove = $emptyDirectoryList | select -expandproperty FullName

$finalListToRemove의 출력:

finalListToRemove

이제 제거할 폴더 목록을 얻었습니다.

PowerShell의 컬렉션에서 항목 삭제

ForEach-Object cmdlet을 사용하여 컬렉션의 항목을 반복할 수 있습니다. 루프 내에서 Remove-Item cmdlet을 사용할 수 있습니다.

$finalListToRemove | Foreach-Object { Remove-Item $_ }

$_는 컬렉션의 현재 항목을 나타냅니다. 이렇게 하면 testDtestH 폴더가 삭제됩니다.

여기서 까다로운 부분이 있습니다. 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 }
Migel Hewage Nimesha avatar Migel Hewage Nimesha avatar

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.

관련 문장 - PowerShell Folder