Найти и заменить текст в нескольких файлах - PullRequest
1 голос
/ 05 апреля 2011

Я перенес веб-сайт typo3 (LAMP) с сервера Knopix на компьютер с Ubuntu 10.04. Сейчас половина сайта вроде работает, а другая нет. Я думаю, что нашел проблему, но не могу ее решить, потому что у меня недостаточно математики, поэтому я могу хорошо выполнять регулярные выражения

На новом сервере файлы находятся в "/ var / www / cms" У старого сервера они были в /media/sda3/www/quickstart-4.2.1/

Я думаю, что все файлы, которые находятся в "/ var / www / cms", включая вложенные каталоги, которые содержат строку "/media/sda1/www/quickstart-4.2.1/", следует заменить на "/ var / www / cms "сайт будет работать нормально.

Помощь очень понравилась бы этому новичку Unix. Заранее спасибо!

B

Ответы [ 2 ]

0 голосов
/ 05 апреля 2011

Найдите основанные конвейеры - ваш друг.Этот ответ предполагает использование ОС на базе Linux / Unix.

Я настоятельно рекомендую просто вырезать каждую команду, по одной, вставлять в командную строку. Не пытайтесь превратить это в сценарий оболочки, пока у вас не появится больше опыта.,Убедитесь, что вы понимаете, что делает каждый шаг, и трижды убедитесь, что результаты действительно такие, какими они должны быть, а НЕ просто то, что вы хотите, чтобы это было ИЛИ предположить, что это должно быть; -!)

# goto the root of your new filesystem
cd /var/www/cms

# print out the filenames with the old path in it
find . -print | xargs grep -l "/media/sda1/www/quickstart-4.2.1/" 
# find . -print all fileNames
              # take output from find (via pipe)
                # xargs manages creation of command line with filenames from pipe
                     # grep -l saarchs for target string and prints only file names

# make sure there are no files in this list that shouldn't be modified.

# backup files in list
find . -print | xargs -I {} /bin/cp {} {}.sav_20110405
# note that the sav_20110405 is date composed by YYYYMMDD.
# A good habit to get into

# run a test on one file from list above
 testFile=/var/www/cms/yourFileNameHere.html

find . -print -name ${testFile} \
| grep -v 'sav_20110405$' \
| while read fName ; do 
     ex - ${fName} <<EOS
     :%s/\/media\/sda1\/www\/quickstart-4.2.1/\/var\/www\/cms/g
     :wq
EOS

done

Это хорошо, потому что с помощью решения sed вы должны управлять перенаправлением исправления в новый файл, а затем переименовывать исправленный файл в исходный файл.

Редактор ex похож на редактор vi, но предназначендля пакетного ввода инструкций И ​​преимущество в том, что вы можете выполнить команду «write» и «q» выйти.

Важно Некоторые оболочки и / или команды ex имеют проблемы с такой конструкцией,Вот почему мы тестируем один файл с резервной копией.Прежде чем продолжить, убедитесь, что файл в порядке и файл резервной копии на месте.

# inspect the 'fixed file' and be *really* sure there it is correct
# also be sure the ${testFile}.sav_20110405 did NOT get modified.

# run command for all files
find . -print  \
| grep -v 'sav_20110405$' \
| while read fName ; do 
     ex - ${fName} <<EOS
     :%s/\/media\/sda1\/www\/quickstart-4.2.1/\/var\/www\/cms/
     :wq
EOS

done

Запишите в свой список задач на 1 месяц позже, вернитесь и удалите сохраненные файлы.

find . -print -name '*.sav_20110405'

выберите имя файла

find . -print -name 'myTestFile.sav_20110405' | xargs /bin/rm

убедитесь, что это был единственный удаленный файл.

Теперь очистите остальные файлы

find . -print -name '*.sav_20110405' | xargs /bin/rm

Удачи И тройнойпроверьте все; -)!.

Надеюсь, это поможет.

PS, поскольку вы выглядите новым пользователем, если вы получите ответ, который поможет вам, не забудьте пометить его как принятый,и / или дайте ему + (или -) в качестве полезного ответа.

0 голосов
/ 05 апреля 2011

Не похоже, что для этого нужно регулярное выражение.
Это обычный поиск / замена строк, который вы можете выполнять в любом текстовом редакторе. Многие текстовые редакторы также могут не только искать / заменять один открытый файл, но и искать в директории дыр. Я часто использую jEdit

Также должно быть намного проще не редактировать файлы непосредственно на сервере, а работать с локальной копией и передавать файлы после их исправления.

...