Super User is a question and answer site for computer enthusiasts and power users. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

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.

share|improve this question
    
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 '11 at 14:36
up vote 7 down vote accepted

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

share|improve this answer
    
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. – oshirowanen Jan 18 '11 at 14:49
1  
Added bit about -l – Doug Harris Jan 18 '11 at 15:49

You can also use grep alone without find:

grep -Rli 'old string' /var/www > list_of_files
share|improve this answer

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'
share|improve this answer

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".

share|improve this answer

You must log in to answer this question.

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