The Silver Searcher Solution
I'm adding another option for those people who don't know about the amazing tool called The Silver Searcher (command line tool is ag).
Note: You can use grep and other tools to do the same thing here, but The Silver Searcher is fantastic :)
TLDR
ag -l 'abc' | xargs sed -i 's/abc/xyz/g'
Install The Silver Searcher
sudo apt install silversearcher-ag # Debian / Ubuntu sudo pacman -S the_silver_searcher # Arch / EndeavourOS sudo yum install epel-release the_silver_searcher # RHEL / CentOS
Demo Files
Paste the following into your terminal to create some demonstration files:
mkdir /tmp/food cd /tmp/food content="Everybody loves to abc this food!" echo "$content" > ./milk echo "$content" > ./bread mkdir ./fastfood echo "$content" > ./fastfood/pizza echo "$content" > ./fastfood/burger mkdir ./fruit echo "$content" > ./fruit/apple echo "$content" > ./fruit/apricot
Using 'ag'
The following ag command will recursively find all the files that contain the string 'abc'. It ignores the .git directory, .gitignore files, and other ignore files:
$ ag 'abc' milk 1:Everybody loves to abc this food! bread 1:Everybody loves to abc this food! fastfood/burger 1:Everybody loves to abc this food! fastfood/pizza 1:Everybody loves to abc this food! fruit/apple 1:Everybody loves to abc this food! fruit/apricot 1:Everybody loves to abc this food!
To just list the files that contain the string 'abc', use the -l switch:
$ ag -l 'abc' bread fastfood/burger fastfood/pizza fruit/apricot milk fruit/apple
Changing Multiple Files
Finally, using xargs and sed, we can replace the 'abc' string with another string:
ag -l 'abc' | xargs sed -i 's/abc/eat/g'
In the above command, ag is listing all the files that contain the string 'abc'. The xargs command is splitting the file names and piping them individually into the sed command.
sed -i 's/abc/xyz/g' xa*?