Programing

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

lottogame 2020. 3. 26. 08:18
반응형

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


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

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

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

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

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


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

Get-ChildItem -recurse | Select-String -pattern "dummy" | group path | select name

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

항목 (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
    

당신의 내용을 파이프

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

경로, 파일 이름 및 패턴과 일치하는 내용 줄이 표시됩니다.

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

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

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


이것이 내가하는 방법입니다. 콘텐츠가 필요하지 않습니다.

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

또는

ls -r | Select-String dummy | fl *

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


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

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

또는 짧게 :

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

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

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

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

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

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


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

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"

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

참고 URL : https://stackoverflow.com/questions/8153750/how-to-search-a-string-in-multiple-files-and-return-the-names-of-files-in-powers

반응형