Friday, December 22, 2006

 

Редактирование множетва файлов (diff, patch)

В случае, если необходимо сделать мелкие исправления сразу в множестве не идеинтичных файлов, могут очень помочь утилиты diff/patch.

Например, сегодня нужно было исправить e-mail адреса в конфигах десяти разных инсталляциях одной программы. Можно было ручками пройтись и тупо редактировать файлы, но это не интересно. Вот, как это можно сделать:

mkdir _wrk && cd _wrk - создать временный каталог
cp ~/installation1/file . - скопировать в него один из файлов.
cp file file.bak - сохранить старую версию
vim file - внести необходимые изменения
diff file.bak file > ~/patch - создать патч.

cd ~ - перейти в каталог, в котором наохдятся все инсталляции
find -name file -print0 | xargs -n1 -J % echo "patch " % " ~/patch" > script найти все файлы, которые нужно отредактировать и сохранить скрипт, который сделает все необходимые изменения

cat script - убедиться, что не нашлось ничего лишнего (например, тот же файл, но в бекапах)
sh script - поехали!


Далее, необходимо убедиться в том, что все ок и удалить *.orig файлы (резервные копии, оставленные программой patch. Сделать это можно командой find -name file.orig -rm).

При составлении патча нужно быть внимательным, т.к. легко перепутать исходный и резервный файлы и получить "перевернутый" патч, который будет пытаться делать в исходном файле изменения, которые необходимо сделать в отредактированном для получения исходного. Впрочем, программа patch корректно обрабатывает эту ситуацию и не даст испортить файл. Но все равно, лучше сразу сделать все нормально.

Comments:
Если умный sed, то решать задачу лучше с помощью find ... | xargs -0 sed -i .orig 's///g', если sed глупый, то заменить его на perl -p -i .orig -e 's///g'

patch тут как-то очень сбоку :)
 
patch эту задачу решает как-то по-нагляднее.. И потом, в моем случае изменения были объемными, замучаешься писать регекспы..

Хотя.. наверное, именно для конфиг-файлов подойдет что-нибудь вроде perl -pi.orig -e 's/^(Option1).+?$/$1\tNewValue\n/g; s///g; s///g;', но, честно говоря, не очень красиво..
 
Post a Comment



<< Home

This page is powered by Blogger. Isn't yours?