여러 파일에서 문자열을 검색하고 Powershell에서 파일 이름을 반환하는 방법은 무엇입니까?


303

며칠 전에 Powershell을 배우기 시작했으며 Google에서 필요한 것을 수행하는 것을 찾을 수 없으므로 내 질문을 참아주십시오.

일부 텍스트 문자열을 여러 파일로 바꾸라는 요청을 받았습니다. 가능한 대상 파일의 확장자를 반드시 알 필요는 없으며 그 위치도 모릅니다. 지금까지 나는 디렉토리 ( get-ChildItem -recurse) 를 재귀 적으로 탐색 하고 get-content 및 select-string으로 찾고있는 문자열을 찾았습니다.

Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy"

문제는 내가 찾고있는 텍스트의 발생을 볼 수 있지만 PS에게 일치하는 모든 파일의 경로와 이름을 반환하도록 지시하는 방법을 모른다는 것입니다.

찾고있는 표현식이 포함 된 파일의 이름과 위치는 어떻게 알 수 있습니까?


2
더 일반적인 질문을 편집하십시오. 이 질문에 대한 대답은 제이보스 또는 당신이 그것에 작동하는지 응용 프로그램과 아무 상관이 ... 보인다
계산법 캐년

5
방금 귀하의 의견을 발견하고 2 년 후 내 질문을 편집했습니다! 결코 늦지 않는 것보다 늦다 .. :)
Bluz

답변:


468

패턴이 포함 된 파일의 위치를 ​​지정해야합니다.

Get-ChildItem -Recurse | Select-String "dummy" -List | Select Path

3
해당 파일을 이동하려면 어떻게해야합니까? ... 가입 할 수없는 오류가 발생합니다. 그것의 끝으로 항목을 이동하십시오.
rud3y September

6
Move-Item에 name매개 변수 가 없습니다 . 추가 시도| %{Move-Item $_.name <destination>}
jon Z

49
Get-ChildItem -Recurse | Select-String "dummy" -List | Select Path각 파일에 대한 첫 번째 일치 만 반환하므로 조금 더 효율적일 수 있으며 그룹화 할 필요가 없습니다.
ben

5
대신 txt사용 Get-ChildItem -Recurse -Filter *.txt하는 경우 파일과 같은 특정 파일 형식 만 필터링 할 수 있다는 점에 주목할 가치가 있습니다.
Girardi

@ rud3y foreach큰 작업을 수행하는 경우 루프를 사용하여 스크립트로 작성하는 것이 좋습니다 . 한 줄에 모든 것을하려고하면 큰 혼란이 생기고 큰 실수를 저지르는 것은 매우 쉽습니다. 나는 경험에서 말합니다
Kolob Canyon

74

여기에는 다양한 정확한 답변이 있지만 여기에 몇 가지 다른 변형에 대한 가장 간결한 코드가 있습니다. 각 변형에 대해 맨 위 줄에 전체 구문이 표시되고 맨 아래에 간결한 구문이 표시됩니다.

항목 (2)는 Jon Z와 manojlds의 답변의 간결한 형태이며, 항목 (1)은 vikas368 및 buygrush의 답변과 동일합니다.

  1. 패턴을 포함하는 모든 파일의 FileInfo 오브젝트를 나열하십시오 .

    Get-ChildItem -Recurse filespec | Where-Object { Select-String pattern $_ -Quiet }
    ls -r filespec | ? { sls pattern $_ -q }
    
  2. 패턴을 포함하는 모든 파일의 파일 이름 을 나열 하십시오 .

    Get-ChildItem -Recurse filespec | Select-String pattern | Select-Object -Unique Path
    ls -r filespec | sls pattern | select -u Path
    
  3. 패턴을 포함 하지 않는 모든 파일에 대한 FileInfo 오브젝트를 나열하십시오 .

    Get-ChildItem -Recurse filespec | Where-Object { !(Select-String pattern $_ -Quiet) }
    ls -r filespec | ? { !(sls pattern $_ -q) }
    
  4. 패턴을 포함 하지 않는 모든 파일의 파일 이름 을 나열 하십시오 .

    (Get-ChildItem -Recurse filespec | Where-Object { !(Select-String pattern $_ -Quiet) }).FullName
    (ls -r filespec | ? { !(sls pattern $_ -q) }).FullName
    

또한 패턴이 포함 된 파일을 어디에서나 찾고 있다면-ListSelect-String
KyleMit

OP가 질문에 약간의 변형을 요청하여 이것이 AA가 되길 바랍니다. # 1은 매우 유용했으며 @Michael Sorens가 PS를 groks한다는 것은 분명합니다!
cBlaine

20

패턴과 일치하는 경로, 파일 이름 및 컨텐츠 라인이 표시됩니다.

Get-ChildItem -Path d:\applications\*config -recurse |  Select-String -Pattern "dummy" 

결과 사이에
줄만

15

당신의 내용을 파이프

Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy"

fl *

경로가 이미 객체의 속성으로 반환되고 있음을 알 수 있습니다.

경로 만 원하면 select path또는 select -unique path을 사용 하여 중복을 제거하십시오.

Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy" | select -unique path

1
둘 다 덕분에, 이것은 내가 찾고있는 것입니다. 불행히도 경로에 많은 하위 디렉토리가있는 경우 PS는 절대 경로를 자르고 \ dir1 \ dir2 \ dir3 \ path와 같이 줄 끝에 3 개의 점을 추가합니다. 그래서 어떤 파일이 반환되는지 알 수 없습니다 . PS에게 문자에 대한 욕심이 덜하고 전체 경로를 표시하는 것을 귀찮게하는 방법이 있습니까? :) 감사합니다!
Bluz

3
-File스위치 를 추가 Get-ChildItem하거나 Get-Content디렉토리 를 호출하려고 할 때 끊임없이 끝나는 오류가 발생합니다 .
RubberDuck

전체 경로가 필요한 경우이 작업을 수행 할 수 있습니다. (Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy").FullName사람들은 PowerShell이 ​​객체 지향임을 잊는 것 같습니다. 의심
스러운

10

이것이 내가하는 방법입니다. 콘텐츠를 얻을 필요가 없습니다.

ls -r | Select-String dummy | select line,path

또는

ls -r | Select-String dummy | fl *

다른 속성이 무엇인지 보려면 ...

이것은 더 빠릅니다. 두 번째 인수는 -filter입니다.

ls -r . *.bat | select-string netsh

2
+1, 이것은 내 경우에는 완벽하게 작동하지만 select Pattern, LineNumber, Filename더 간결한 출력을 위해 사용하십시오 . Line은 패턴 문자열을 포함하는 행에서 EVERYTHING을 리턴합니다. 원하는 경우이를 CSV로 쉽게 출력 할 수도 있습니다.
Protonova

9
Get-ChildItem -r | ? {$_.psiscontainer -eq $false} | ? {gc $_.pspath |select-string -pattern "dummy"}

이것은 당신에게 모든 파일의 전체 세부 사항을 제공합니다


그것이 -r효과가 있다는 것을 전혀 몰랐습니다 . 항상해야 -Recurse
Kolob Canyon

5

전체 파일 상세 정보를 결과 배열로 유지하려면 vikas368에 의해 게시 된 답변을 약간 수정하여 사용할 수 있습니다 (ISE 자동 완성에서는 제대로 작동하지 않는 것 같습니다).

Get-ChildItem -Recurse | Where-Object { $_ | Select-String -Pattern "dummy" }

또는 짧게 :

ls -r | ?{ $_ | Select-String -Pattern "dummy" }

5

하나의 디렉토리로 검색하면 다음을 수행 할 수 있습니다.

select-string -Path "c:\temp\*.*" -Pattern "result"  -List | select Path

4

검색 문자열이 포함 된 각 파일의 전체 경로 목록이 표시됩니다.

foreach ($file in Get-ChildItem | Select-String -pattern "dummy" | Select-Object -Unique path) {$file.path}

결과 위에 헤더를 표시하지 않으며 검색 문자열을 포함하는 텍스트 줄을 표시하지 않습니다. 문자열이 포함 된 파일을 찾을 수있는 위치 만 알려줍니다.


2
파일 이름과 함께 패턴을 찾은 줄 번호를 표시하는 방법을 알고 있습니까?
Piotr L

4

위의 답변 중 하나를 수정하여 조금 더 많은 정보를 제공했습니다. 이로 인해 나중에 두 번째 쿼리가 필요했습니다. 다음과 같은 것이 었습니다.

Get-ChildItem `
        -Path "C:\data\path" -Filter "Example*.dat" -recurse | `
    Select-String -pattern "dummy" | `
    Select-Object -Property Path,LineNumber,Line | `
    Export-CSV "C:\ResultFile.csv"

이 구조로 경로 및 파일 와일드 카드를 지정할 수 있으며 파일 이름, 줄 번호 및 관련 줄을 출력 파일에 저장합니다.


멋있는! 이 추가 솔루션에 감사드립니다 :) 그러나 솔루션을 기반으로 한 답변에 링크하고 해당 답변의 작성자를 지정하여 크레딧을 줄 수 있습니까? 감사!
Max Vollmer 2014 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.