Как в Linux найти и рекурсивно заменить строку во всех файлах?

Допустим нам требуется заменить email: root@mail.domain.ru на sf@nagg.ru во всех файлах в каталоге /home/www.
Наиболее оптимальным вариантом выглядит следующая конструкция:

find /home/www -type f -print0 | xargs -0 sed -i 's/root@mail\.domain\.ru/sf@nagg.ru/g'

В данной конструкции используется print0, ниже выдержка из man find:

-print0 (GNU find only) tells find to use the null character (\0)
instead of whitespace as the output delimiter between pathnames found.
This is a safer option if you files can contain blanks or other special character.
It is recommended to use the -print0 argument to find if you use -exec command or xargs
(the -0 argument is needed in xargs.).

После выполнения, мы можем проверить что root@mail.domain.ru более нигде не прописан (файлов в выводе не должно быть):

grep -rl 'root@mail.domain.ru' /home/www/

Альтернативный вариант замены email, который, вероятно, более простой:

find /home/www/ -type f -exec sed -i 's/sf@nagg\.ru/root@mail.domain.ru/g' {} +

Учтите, что если вы используете BSD sed (это относится также к Mac OS X), вам нужно добавить пустую строку, используя аргумент sed-а -i », это решает Mac OS X проблему sed: 1: «…»: invalid command code.
Выглядеть это будет так:

sed -i '' 's/sf@nagg\.ru/root@mail.domain.ru/g' {} +

Related posts:

  1. Поиск файлов в Linux Часто возникают ситуации, когда требуется найти один или несколько файлов,...
  2. rm: Argument list too long Если в вашем каталоге слишком много файлов (например файлов сессий...
  3. Простое копирование файлов в linux/unix системах Для переноса каталога easycopy с одного сервера на другой, используем...
  4. Сервер DHCP на LINUX/UNIX В данной статье затронута организация DHCP сервера на Linux системах....
  5. Как измерить производительность диска в Linux? В данной статье я расскажу как измерять IOPS на вашем...
You can leave a response, or trackback from your own site.

Оставить комментарий

*