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

  1. PowerShell의 Get-ChildItem Cmdlet
  2. PowerShell의 Where-Object Cmdlet
  3. PowerShell에서 컬렉션에서 항목 삭제하기
  4. 결론
PowerShell에서 빈 폴더 삭제하는 방법

효과적인 디렉토리 관리는 PowerShell 스크립팅에서 필수적이며, Get-ChildItem cmdlet은 파일 시스템 탐색의 핵심 역할을 합니다. 빈 폴더를 정리하는 작업을 할 때 폴더 계층을 탐색하는 것이 중요해집니다.

이 문서에서는 Get-ChildItem 및 다른 cmdlet을 활용하여 지정된 경로 내에서 빈 디렉토리를 체계적으로 식별하고 제거하는 실용적인 사용법을 다룹니다. PowerShell의 강력한 스크립팅 기능을 활용하여 사용자는 효율적으로 디렉토리를 관리하고 정리된 파일 시스템을 유지할 수 있습니다.

PowerShell의 Get-ChildItem Cmdlet

Get-ChildItem cmdlet은 지정된 위치의 모든 자식 항목(파일 및 폴더)을 검색합니다. 주어진 폴더 경로 내의 모든 빈 폴더를 삭제해야 할 필요가 있을 때, 폴더 계층을 탐색하는 것이 필수입니다.

따라서 Get-ChildItem cmdlet이 유용할 것입니다. 이 cmdlet은 디렉토리 타입의 자식 항목을 가져오고 폴더 구조를 재귀적으로 탐색하기 위해 RecurseDirectory와 같은 매개변수를 허용합니다.

구문:

 powershellCopyGet-ChildItem -Path -Directory -Recurse

사용할 수 있는 추가 선택적 매개변수가 많이 있습니다. 다음과 같이 폴더 구조를 생성해 봅시다.

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

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

  1. testD
  2. testG
  3. 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

출력:

Get-ChildItem

모든 디렉토리와 하위 디렉토리가 예상대로 가져와졌습니다.

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

출력:

Where-Object

결과가 완벽히 올바릅니다. 우리는 빈 내용의 testDtestH라는 두 개의 폴더만 가졌습니다.

우리는 $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의 출력:

finalListToRemove

이제 우리는 제거할 폴더 목록을 갖게 되었습니다.

PowerShell에서 컬렉션에서 항목 삭제하기

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

 powershellCopy$finalListToRemove | ForEach-Object { Remove-Item $_ }

$_는 컬렉션의 현재 항목을 나타냅니다. 이 코드는 testDtestH 폴더를 삭제합니다.

여기에서 주의해야 할 부분이 있습니다. 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의 강력한 기능으로 인해 디렉토리 관리는 시스템 관리의 원활한 측면이 되며, 사용자가 최적의 시스템 성능을 유지할 수 있도록 지원합니다.

튜토리얼이 마음에 드시나요? DelftStack을 구독하세요 YouTube에서 저희가 더 많은 고품질 비디오 가이드를 제작할 수 있도록 지원해주세요. 구독하다
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