 |

01.08.2009, 16:17
|
|
Постоянный
Регистрация: 22.06.2007
Сообщений: 365
С нами:
9940629
Репутация:
0
|
|
Есть SSH доступ. Есть папка. В ней куча подпапок и файлов.
Задача - найти все файлы, которые называются допустим "myfile.html" (порядка 50 одинаковых файлов, с одинаковым названием), и заменить в них строчку http://site.com/dir/?page=100 на http://another.com/dir2/?page=250
Подскажите, плз, возможно ли это сделать через шелл? Как это должно выглядеть?
Наверное стоит смотреть в сторону sed, вроде как:
sed 's/stringa1/stringa2/g' example.txt replace "string1" with "string2" in example.txt
|
|
|

01.08.2009, 18:11
|
|
Новичок
Регистрация: 18.04.2009
Сообщений: 18
С нами:
8981197
Репутация:
0
|
|
может, использовать ssh-клиента в пакетном режиме (batch mode)?
|
|
|

04.08.2009, 15:09
|
|
Новичок
Регистрация: 08.05.2008
Сообщений: 21
С нами:
9477937
Репутация:
0
|
|
dig555 написал(а):
Есть SSH доступ. Есть папка. В ней куча подпапок и файлов.
Задача - найти все файлы, которые называются допустим "myfile.html" (порядка 50 одинаковых файлов, с одинаковым названием), и заменить в них строчку http://site.com/dir/?page=100 на http://another.com/dir2/?page=250
Подскажите, плз, возможно ли это сделать через шелл? Как это должно выглядеть?
Наверное стоит смотреть в сторону sed, вроде как:
sed 's/stringa1/stringa2/g' example.txt replace "string1" with "string2" in example.txt
Да, смотреть надо в сторону седа, только из-за наличия "/" в том что ты ищещь/на что меняешь надо изменить синтаксис на такой:
sed -e "s#http://site.com/dir/?page=100#http://another.com/dir2/?page=250#g"
Да и скриптик можно для это цели заюзать:
Код:
Код:
#!/bin/bash
FILES=`find . -name myfile.html`
for i in ${FILES} do
sed -i -e "s#http://site.com/dir/?page=100#http://another.com/dir2/?page=250#g" $i
done
Кладешь его корень того, где искать будешь, делаешь исполняемым (chmod +x script.sh) и пускаешь. Должно робить.
ЗЫ. Писал из головы, но должно работать. На всякий случай сделай бекап.
|
|
|

10.08.2009, 12:33
|
|
Постоянный
Регистрация: 22.06.2007
Сообщений: 365
С нами:
9940629
Репутация:
0
|
|
Проблемку в тот раз решал всё-таки вручную. Ибо бекап сделать нет возможности. Но задача для меня очень актуальная, и в будущем возможно всплывёт не раз.
Поэтому давайте разберёмся до конца.
Собственно, главный вопрос - можно ли обойтись без баш-скриптинга?
Немножко порыл маны и нашёл конструкцию вроде такой:
Код:
Код:
find . -name *.html -exec sed -i 's/oldtext/newtext/g' {} \;
C учётом требований моей задачи, я думаю она должна выглядеть где-то так:
Код:
Код:
find . -name myfile.html -exec sed -i 's#http://site.com/dir/?page=100#http://another.com/dir2/?page=250#g'
Скажите, пожалуйста, возможна ли такая команда? И для чего в примере символы
Код:
|
|
|

11.08.2009, 17:50
|
|
Новичок
Регистрация: 08.05.2008
Сообщений: 21
С нами:
9477937
Репутация:
0
|
|
dig555 написал(а):
Ибо бекап сделать нет возможности.
Это плохо. Тогда пока тренируешься не ставь ключик -i и файлы останутся не тронутыми, а результат будет валиться на экран. Там и увидишь ошибки, если они есть. Как все отработаешь и убедишься в отсутствии ошибок, пускай с ключем -i
dig555 написал(а):
для чего в примере символы
Код:
фигурные скобки - вместо них будет подставлен результат того что найдет find, а
Код:
обозначает конец аргументов (обратный слеш - экранизация). Все что находится между ними считается аргументами для команды.
Соответственно, использование этих символов в твоем случае необходимо.
Код:
Код:
find . -name myfile.html -exec sed -i 's#http://site.com/dir/?page=100#http://another.com/dir2/?page=250#g' {} \;
Еще раз напоминаю про важность ключа -i. Пока тренируешься - убери, а ключик -e нужен для "расщиренных" регэкспов, но не мешает обычным. Удачи!
|
|
|

01.11.2009, 20:50
|
|
Новичок
Регистрация: 23.08.2009
Сообщений: 15
С нами:
8798481
Репутация:
0
|
|
Короткий и работающий способ, даже если имена файлов содержат пробелы:
Код:
Код:
find директория с файлами -iname 'маска файлов' -print0 | xargs -0 -n 1 sed -i -e 's/исходная строка/требуемая строка/g'
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|