Marino
Marino

Reputation: 13

Search and replace entire files

I've seen numerous examples for replacing one string with another among multiple files but what I want to do is a bit different. Probably a lot simpler :)

Find all the files that match a certain string and replace them completely with the contents of a new file.

I have a find command that works

find /home/*/public_html -name "index.php" -exec grep "version:1.23" '{}' \; -print 

This finds all the files I need to update. Now how do I replace their entire content with the CONTENTS of /home/indexnew.txt (I could also name it /home/index.php)

I emphasize content because I don't want to change the name or ownership of the files I'm updating.

Upvotes: 1

Views: 102

Answers (3)

BMW
BMW

Reputation: 45343

I am not sure if your command without -l and then print it is better than to add -l in grep to list file directly.

find /home/*/public_html -name "index.php" -exec grep -l "version:1.23" '{}' \;  |xargs -i cp /home/index.php {}

Here is the option -l detail

   -l, --files-with-matches
          Suppress  normal  output;  instead  print the name of each input
          file from which output would normally have  been  printed.   The
          scanning  will  stop  on  the  first match.  (-l is specified by
          POSIX.)

Upvotes: 0

glenn jackman
glenn jackman

Reputation: 247210

find ... | while read filename; do cat static_file > "$filename"; done

efficiency hint: use grep -q -- it will return "true" immediately when the first match is found, not having to read the entire file.

Upvotes: 1

mrfred
mrfred

Reputation: 631

If you have a bunch of files you want to replace, and you can get all of their names using wildcards you can try piping output to the tee command:

cat my_file | tee /home/*/update.txt

This should look through all the directories in /home and write the text in my_file to update.txt in each of those directories.

Let me know if this helps or isn't what you want.

Upvotes: 0

Related Questions