PowerShell을 사용한 재귀 파일 검색


238

모든 폴더에서 파일을 검색하고 있습니다.

Copyforbuild.bat 많은 곳에서 사용할 수 있으며 재귀 적으로 검색하고 싶습니다.

$File = "V:\Myfolder\**\*.CopyForbuild.bat"

PowerShell에서 어떻게 할 수 있습니까?

답변:


393

사용 가져 오기-ChildItem을의 와 cmdlet에 -Recurse스위치를 :

Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force

1
디렉토리에 액세스하면 액세스 권한이 없으면 프로세스가 종료되어 전체 검색이 중단되는 문제가있는 것 같습니다. 그 주위에 방법이 있습니까?
deed02392

6
ErrorAction 매개 변수를 Continue 또는 SilentlyContinue로 설정하십시오 (값이 언급되지 않은 경우).
Shay Levy

22
정확히 같은 일을하고 짧은 방법 : cd V:\MyFolder다음ls -r -inc CopyForBuild.bat
오리온 에드워즈

8
위의 주석가의 의미는 다음과 같습니다.ls -r -ea silentlycontinue -fo -inc "filename.txt" | % { $_.fullname }
Andrew

*파일 이름 끝에 astric 기호 ( )를 추가하여 부분 문자열을 수행하도록이 답변을 수정했습니다 . ****** LINE1 : $File = "Microsoft.OData.Core.NetFX35.V7*"LINE2 : $Folder = "C:\Program Files"LINE3 :Get-ChildItem -Path $Folder -Filter $File -Recurse -ErrorAction SilentlyContinue -Force
Sherlock

37

나는 이것을 사용하여 파일을 찾은 다음 PowerShell이 ​​결과의 전체 경로를 표시하게합니다.

dir -Path C:\FolderName -Filter FileName.fileExtension -Recurse | %{$_.FullName}

및 / 또는 *에서 와일드 카드 를 항상 사용할 수 있습니다 . 예를 들면 다음과 같습니다.FolderNameFileName.fileExtension

dir -Path C:\Folder* -Filter File*.file* -Recurse | %{$_.FullName}

위의 예는 C:\드라이브에서 단어로 시작 하는 모든 폴더를 검색합니다 Folder. 따라서 이름이 지정된 폴더가 FolderFoo있고 FolderBarPowerShell은 두 폴더 모두에서 결과를 표시합니다.

파일 이름과 파일 확장자도 마찬가지입니다. 특정 확장자를 가진 파일을 검색하려고하지만 파일 이름을 모르는 경우 다음을 사용할 수 있습니다.

dir -Path C:\FolderName -Filter *.fileExtension -Recurse | %{$_.FullName}

혹은 그 반대로도:

dir -Path C:\FolderName -Filter FileName.* -Recurse | %{$_.FullName}

4
이 답변은 특정 사용 사례를 다루기 때문에 실제로 유용합니다. 실제로 찾고있는 파일을 사용하려고합니다. | 파일의 전체 이름을 알려주는 것은 다른 답변에서 누락 된 것입니다.
Newteq Developer

1
@ Sanity1123에 동의해야합니다. 실제로 파일을 사용하려면 파일의 전체 경로가 필요합니다. IMHO 이것은 정답입니다.
uceumern

31

보안 (예 :)에 따라 오류가 발생할 수있는 폴더를 검색 할 때는 C:\Users다음 명령을 사용하십시오.

Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force

12
Get-ChildItem V:\MyFolder -name -recurse *.CopyForbuild.bat

작동합니다


결과를 파일로 출력하려면 명령 끝에`> path_to_filename.txt`를 추가하면됩니다.
그웬 오

7

다음은 고군분투 한 후에 마침내 생각해 낸 방법입니다.

Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*

출력을 더 깨끗하게 만들려면 (경로 만) 다음을 사용하십시오.

(Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*).fullname

첫 번째 결과 만 얻으려면 다음을 사용하십시오.

(Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*).fullname | Select -First 1

이제 중요한 것들 :

파일 만 검색하려면 / 디렉토리는 할 수 없습니다 사용 -File또는 -Directory(이유는 아래 참조). 대신 파일에 이것을 사용하십시오.

Get-ChildItem -Recurse -Path ./path*/ -Include name* | where {$_.PSIsContainer -eq $false}

그리고 제거 -eq $falsefor 디렉토리를 . 마십시오 하지 같은 후행 와일드 카드를 남겨 bin/*.

내장 스위치를 사용하지 않는 이유는 무엇입니까? 그들은 끔찍하고 무작위로 기능을 제거합니다. 예를 들어-Include 파일과 함께 하려면 경로를 와일드 카드로 끝내야합니다. 그러나 이렇게하면 -Recurse사용자에게 알리지 않고 스위치가 비활성화됩니다 .

Get-ChildItem -File -Recurse -Path ./bin/* -Include *.lib

*.lib모든 하위 디렉토리의 모든 것을 제공 할 것이라고 생각 하지만 최상위 레벨 만 검색합니다 bin.

디렉토리를 검색하려면 다음을 사용할 수 있습니다. -Directory 있지만 후행 와일드 카드를 제거해야합니다. 어떤 이유로 든 비활성화되지 않습니다 -Recurse. 이러한 이유로 인해 내장 플래그를 사용하지 않는 것이 좋습니다.

이 명령을 상당히 단축 할 수 있습니다.

Get-ChildItem -Recurse -Path ./path*/ -Include name* | where {$_.PSIsContainer -eq $false}

된다

gci './path*/' -s -Include 'name*' | where {$_.PSIsContainer -eq $false}
  • Get-ChildItem 에 별칭입니다 gci
  • -Path 기본적으로 위치 0으로 설정되므로 첫 번째 인수 경로를 만들 수 있습니다.
  • -Recurse 에 별칭입니다 -s
  • -Include 속기가 없습니다
  • 이름 / 경로의 공백에는 작은 따옴표를 사용하여 전체 명령을 큰 따옴표로 묶고 명령 프롬프트에서 사용할 수 있습니다. 다른 방법으로 (작은 따옴표로 둘러싼)하면 오류가 발생합니다.

6

이 시도:

Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse | Where-Object { $_.Attributes -ne "Directory"}

2
| Where-Object { !$_PSIsContainer }폴더를 제외
시키는데

5

와일드 카드를 사용하여 필터링 :

Get-ChildItem -Filter CopyForBuild* -Include *.bat,*.cmd -Exclude *.old.cmd,*.old.bat -Recurse

정규식을 사용하여 필터링 :

Get-ChildItem -Path "V:\Myfolder" -Recurse
| Where-Object { $_.Name -match '\ACopyForBuild\.[(bat)|(cmd)]\Z' }

1
그렇지 '\ACopyForBuild\.(bat|cmd)\Z'않습니까?
E. Sundin

1

@ user3303020 답변에 추가하고 검색 결과를 파일로 출력하려면 다음을 실행하십시오.

Get-ChildItem V:\MyFolder -name -recurse *.CopyForbuild.bat > path_to_results_filename.txt

그런 식으로 올바른 파일을 검색하는 것이 더 쉬울 수 있습니다.

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