Coder Perfect

Find and replace with sed in directory and sub directories


I use this command to find and change all instances of ‘apple’ in all files in the root of my site with ‘orange’:

find ./ -exec sed -i 's/apple/orange/g' {} \;

But it doesn’t go through sub directories.

What exactly is the issue with this command?

Here are some lines from find./’s output:


Asked by hd.

Solution #1

To prevent providing directory names to sed, your find should look like this:

find ./ -type f -exec sed -i -e 's/apple/orange/g' {} \;

Answered by jfg956

Solution #2

grep and xargs are better and faster for larger s&r tasks, so for example;

grep -rl 'apples' /dir_to_search_under | xargs sed -i 's/apples/oranges/g'

Answered by Julius

Solution #3

Because there are macOS users reading this (as I did), I used the following code (on 10.14)

egrep -rl '<pattern>' <dir> | xargs -I@ sed -i '' 's/<arg1>/<arg2>/g' @

On macOS, all other responses that use -i and -e do not work.


Answered by pat-s

Solution #4

This was effective for me:

find ./ -type f -exec sed -i '' 's#NEEDLE#REPLACEMENT#' *.php {} \;

Answered by blackdad

Solution #5

grep -e apple your_site_root/**/*.* -s -l | xargs sed -i "" "s|apple|orage|"

Answered by rocLv

Post is based on