Get-ChildItem을 사용하여 디렉토리 만 가져 오려면 어떻게합니까?


242

PowerShell 2.0을 사용하고 있으며 특정 경로의 모든 하위 디렉토리를 파이프 아웃하고 싶습니다. 다음 명령은 모든 파일과 디렉토리를 출력하지만 파일을 필터링하는 방법을 알 수 없습니다.

Get-ChildItem c:\mypath -Recurse

$_.Attributes속성을 얻기 위해 사용하려고 시도했지만 System.IO.FileAttributes비교할 리터럴 인스턴스를 구성하는 방법을 모르겠습니다 . 에서에게 cmd.exe이 될 것이다

dir /b /ad /s

답변:


292

PowerShell 버전이 3.0 미만인 경우 :

FileInfo의해 반환 된 객체 Get-ChildItem에는 "base"속성이 PSIsContainer있습니다. 해당 항목 만 선택하려고합니다.

Get-ChildItem -Recurse | ?{ $_.PSIsContainer }

디렉토리의 원시 문자열 이름을 원하면 할 수 있습니다

Get-ChildItem -Recurse | ?{ $_.PSIsContainer } | Select-Object FullName

PowerShell 3.0 이상 :

dir -Directory

20
"IsFolder"의 별칭으로 사용하십시오.
xcud

5
xcud : PSDrive가 나타내는 모든 계층 구조가 폴더 기반 인 것은 아닙니다.
Joey

10
"컨테이너"와 "폴더"사이의 시맨틱 갭은 트럭을 운전할 수있는 것이 아닙니다.
xcud 2016 년

5
@xcud : iraSenthil의 답변을 참조하십시오. -Directory 및 -File도 Get-ChildItem에서 작동합니다. PSIsContainer 속성을 직접 사용할 필요가 없습니다.
Wouter

(Get-ChildItem |? {$ _. PSIsContainer} | 이름 선택). 이름
Jose Ortega

195

PowerShell 3.0에서는 더 간단합니다.

Get-ChildItem -Directory #List only directories
Get-ChildItem -File #List only files

33
DIR은-ChildItem을 얻는 별칭입니다
칩 맥코믹

1
@crashmstr 확실합니까? PS4.0을 확인했습니다. 나를 위해, dir별명이되었다 Get-ChildItem, 그리고 -Directory-File옵션은 설명했다. 나는 명령을 사용 echo $PSVersionTable, help dir, dir -Directorydir -File이 댓글을 마련 할 수 있습니다.
피터 헐

3
이것이 정답입니다
Chris S

2
lsdir의 별칭 Get-ChildItem당신의 독 선택
계산법 캐년

53

사용하다

Get-ChildItem -dir #lists only directories
Get-ChildItem -file #lists only files

별칭을 선호하는 경우

ls -dir #lists only directories
ls -file #lists only files

또는

dir -dir #lists only directories
dir -file #lists only files

서브 디렉토리도 재귀하려면 -r옵션을 추가하십시오 .

ls -dir -r #lists only directories recursively
ls -file -r #lists only files recursively 

PowerShell 4.0, PowerShell 5.0 (Windows 10), PowerShell Core 6.0 (Windows 10, Mac 및 Linux) 및 PowerShell 7.0 (Windows 10, Mac 및 Linux)에서 테스트되었습니다 .

참고 : PowerShell Core에서는 -r스위치 를 지정할 때 심볼릭 링크가 따르지 않습니다 . 심볼릭 링크를 따르려면로 -FollowSymlink스위치를 지정하십시오 -r.

참고 2 : PowerShell은 이제 버전 6.0부터 크로스 플랫폼입니다. 크로스 플랫폼 버전은 원래 PowerShell Core라고했지만 PowerShell 7.0 이상부터 "Core"라는 단어가 삭제되었습니다.

Get-ChildItem 설명서 : https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-childitem


2
OP의 특정 요구 사항 인 Powershell 2.0에서는 작동하지 않습니다. -[/ Dir / Directory]는 Powershell 2.0에서 유효한 매개 변수가 아닙니다.
Ben Personick

21

보다 깔끔한 접근법 :

Get-ChildItem "<name_of_directory>" | where {$_.Attributes -match'Directory'}

PowerShell 3.0에 디렉터리 만 반환하는 스위치가 있는지 궁금합니다. 논리적으로 추가하는 것 같습니다.


1
FYI powershell 3.0에 -Directory-File플래그 추가
WickyNilliams


6

PowerShell v2 이상에서 (k는 검색을 시작하는 폴더를 나타냅니다) :

Get-ChildItem $Path -attributes D -Recurse

폴더 이름 만 원하고 다른 것을 원하지 않으면 다음을 사용하십시오.

Get-ChildItem $Path -Name -attributes D -Recurse

특정 폴더를 찾고 있다면 다음을 사용할 수 있습니다. 이 경우에는 다음과 같은 폴더를 찾고 있습니다 myFolder.

Get-ChildItem $Path -attributes D -Recurse -include "myFolder"

그리고 PS 3.0 o 4.0을 사용합니까?
Kiquenet

5
Attributes 매개 변수가 PS2에없는 것 같습니다. "매개 변수 이름 'Attributes'와 일치하는 매개 변수를 찾을 수 없습니다"라는 오류가 발생합니다. PS3에서는 정상적으로 작동합니다.
WileCau

5

이 방법에는 더 적은 텍스트가 필요합니다.

ls -r | ? {$_.mode -match "d"}

이것이 내가 사용하는 것입니다.
David Betz

2
더 짧게 : ls -r | ? {$ _. mode -match "d"}
jyggorath

이 압축 된 폴더를 찾을 수없는
찰스 램버트에게

7
압축 된 폴더에 압축 파일이기 때문에
user1594322을

모든 것을 되풀이하는 것이 항상 유용한 것은 아닙니다. 정확히 두 레벨 아래의 디렉토리에만 관심이있는 매우 깊고 수풀이 많은 나무를 가질 수 있습니다. 30 레벨을 낮추는 것은 시간 낭비입니다.
Ross Presser

4

사용하다:

dir -Directory -Recurse | Select FullName

디렉토리의 폴더 이름을 가진 루트 구조의 출력이 제공됩니다.


3

사용하다:

Get-ChildItem \\myserver\myshare\myshare\ -Directory | Select-Object -Property name |  convertto-csv -NoTypeInformation  | Out-File c:\temp\mydirectorylist.csv

다음은 무엇입니까

  • 대상 위치에있는 디렉토리 목록을 가져옵니다. Get-ChildItem \\myserver\myshare\myshare\ -Directory
  • 디렉토리 이름 만 추출하십시오. Select-Object -Property name
  • 출력을 CSV 형식으로 변환하십시오. convertto-csv -NoTypeInformation
  • 결과를 파일로 저장하십시오. Out-File c:\temp\mydirectorylist.csv

2
더 많은 사람들이 무슨 일이 일어나고 있는지 알 수 있도록 각 단계를 설명 할 수 있다면 좋을 것입니다.
jazzurro

OP의 특정 요구 사항 인 Powershell 2.0에서는 작동하지 않습니다. -[/ Dir / Directory]는 Powershell 2.0에서 유효한 매개 변수가 아닙니다.
Ben Personick

2

아래 스크립트를 통해 조금 더 읽기 쉽고 간단한 접근 방식을 얻을 수 있습니다.

$Directory = "./"
Get-ChildItem $Directory -Recurse | % {
    if ($_.Attributes -eq "Directory") {
        Write-Host $_.FullName
    }
}

도움이 되었기를 바랍니다!


2

당신이 사용하고자하는 것 은 Get-ChildItem을을 반복적으로 먼저 모든 폴더와 파일을 얻을 수 있습니다. 그런 다음 해당 출력을 파일 만 가져 오는 Where-Object 절로 파이프 하십시오.

# one of several ways to identify a file is using GetType() which
# will return "FileInfo" or "DirectoryInfo"
$files = Get-ChildItem E:\ -Recurse | Where-Object {$_.GetType().Name -eq "FileInfo"} ;

foreach ($file in $files) {
  echo $file.FullName ;
}

1

수락 된 답변에 언급

Get-ChildItem -Recurse | ?{ $_.PSIsContainer } | Select-Object FullName

"원시 문자열"을 얻을 수 있습니다. 그러나 실제로 유형의 객체 Selected.System.IO.DirectoryInfo가 반환됩니다. 원시 문자열의 경우 다음을 사용할 수 있습니다.

Get-ChildItem -Recurse | ?{ $_.PSIsContainer } | % { $_.FullName }

값이 문자열에 연결되어 있으면 차이점이 중요합니다.

  • Select-Object놀랍게도foo\@{FullName=bar}
  • ForEach-operator 와 함께 다음 과 같이 예상됩니다.foo\bar

1
Select-Object는 실제로 PSCustomObject 유형의 개체를 반환합니다. 당신은 당신이했던 것처럼 원시 문자열을 얻기 위해 (를 ForEach-객체이다) %를 사용할 수 있지만, 당신은 또한 사용할 수 있습니다Select-Object -ExpandProperty FullName
JamesQMurphy


0

이것을 사용하십시오 :

Get-ChildItem -Path \\server\share\folder\ -Recurse -Force | where {$_.Attributes -like '*Directory*'} | Export-Csv -Path C:\Temp\Export.csv -Encoding "Unicode" -Delimiter ";"

0

원래 질문에 구체적으로 대답하려면 (IO.FileAttributes 사용) :

Get-ChildItem c:\mypath -Recurse | Where-Object {$_.Attributes -and [IO.FileAttributes]::Directory}

그래도 Marek의 솔루션을 선호합니다 ( Where-Object { $_ -is [System.IO.DirectoryInfo] }).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.