4

How do I recursively generate a text file which has a list of all files on my server which contain a specific string anywhere in the files?

I know the following command can be used to replace a string recursively

find /var/www -type f -print0 | xargs -0 sed -i 's/old string/new string/g'

I do not want to replace the string, I just want a list of all files which contain the string.

1
  • For a windows user I would have suggested to writes a batch file which saves the output to a file and put it in the scheduler . Try whatever is the linux substitute for this process
    – Shekhar
    Jan 18, 2011 at 14:36

4 Answers 4

7

Use grep instead of sed:

find /var/www -type f -print0 | xargs -0 grep -i 'old string'

From the way you phrase the question, it seems like you're not yet too familiar with grep. Read more about its options in its man page type: man grep at your command line.

update to answer comment -- try adding the -l option to show just file names. The -i makes the search case insensitive. The easy to use both is with a single dash: grep -il

2
  • This does not seem to give me just the paths/files containing the string I am looking for. For some reason, I am also getting the text from the files searched too. Jan 18, 2011 at 14:49
  • 1
    Added bit about -l Jan 18, 2011 at 15:49
4

You can also use grep alone without find:

grep -Rli 'old string' /var/www > list_of_files
1

You could try adding the -l flag to the command to only list the file names

find /var/www -type f -print0 | xargs -0 grep -li 'old string'
0

Try ack -- it's faster than grep and supports perl regex.

ack -la <pattern> /var/www

On some systems this package is called "ack" and sometimes its called "ack-grep".

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .