How to search a string in multiple files and return the names of files in Powershell?

StringSearchTextPowershellRecursion

String Problem Overview


I have started learning powershell a couple of days ago, and I couldn't find anything on google that does what I need so please bear with my question.

I have been asked to replace some text strings into multiple files. I do not necessarily know the extension of the possible target files and I don't know their location either. So far I have managed to recursively browse into the directory (get-ChildItem -recurse) and find the string I was looking for with get-content and select-string:

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

The problem is, I can see the occurences of the text I am looking for, but I don't know how to tell PS to return the path and the name for every matching files as well.

How can I get the name and location of the files that contains the expression I am looking for?

String Solutions


Solution 1 - String

This should give the location of the files that contain your pattern:

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

Solution 2 - String

There are a variety of accurate answers here, but here is the most concise code for several different variations. For each variation, the top line shows the full syntax and the bottom shows terse syntax.

Item (2) is a more concise form of the answers from Jon Z and manojlds, while item (1) is equivalent to the answers from vikas368 and buygrush.

  1. List FileInfo objects for all files containing pattern:

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

  1. List file names for all files containing pattern:

Get-ChildItem -Recurse filespec | Select-String pattern | Select-Object -Unique Path
ls -r filespec | sls pattern | select -u Path

  1. List FileInfo objects for all files not containing pattern:

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

  1. List file names for all files not containing pattern:

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

Solution 3 - String

This is how I would do it, you don't need get-content:

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

or

ls -r | Select-String dummy | fl *

To see what the different properties are...

This is faster. The second argument is -filter:

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

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

Solution 4 - String

This will display the path, filename and the content line it found that matched the pattern.

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

Solution 5 - String

Pipe the content of your

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

to fl *

You will see that the path is already being returned as a property of the objects.

IF you want just the path, use select path or select -unique path to remove duplicates:

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

Solution 6 - String

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

This will give you the full details of all files

Solution 7 - String

To keep the complete file details in resulting array you could use a slight modification of the answer posted by vikas368 (which didn't seem to work well with the ISE autocomplete):

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

or in short:

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

Solution 8 - String

I modified one of the answers above to give me a bit more information. This spared me a second query later on. It was something like this:

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"

I can specify the path and file wildcards with this structures, and it saves the filename, line number and relevant line to an output file.

Solution 9 - String

If you search into one directory, you can do it:

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

Solution 10 - String

This will display a list of the full path to each file that contains the search string:

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

Note that it doesn't display a header above the results and doesn't display the lines of text containing the search string. All it tells you is where you can find the files that contain the string.

Solution 11 - String

With PowerShell, go to the path where your files are and then type this command and replace ENTER THE STRING YOU SEARCH HERE (but keep the double quotes):

findstr /S /I /M /C:"ENTER THE STRING YOU SEARCH HERE" *.*

Have a nice day 

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionBluzView Question on Stackoverflow
Solution 1 - Stringjon ZView Answer on Stackoverflow
Solution 2 - StringMichael SorensView Answer on Stackoverflow
Solution 3 - Stringjs2010View Answer on Stackoverflow
Solution 4 - Stringuser5000502View Answer on Stackoverflow
Solution 5 - StringmanojldsView Answer on Stackoverflow
Solution 6 - Stringvikas368View Answer on Stackoverflow
Solution 7 - StringswalexView Answer on Stackoverflow
Solution 8 - StringRenoGregView Answer on Stackoverflow
Solution 9 - StringEsperento57View Answer on Stackoverflow
Solution 10 - StringLittle GirlView Answer on Stackoverflow
Solution 11 - StringJulien CalcadaView Answer on Stackoverflow