HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > РАЗРАБОТКА > Для Администратора > Linux, Freebsd, *nix
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 01.08.2009, 16:17
dig555
Постоянный
Регистрация: 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
 
Ответить с цитированием

  #2  
Старый 01.08.2009, 18:11
iva94119255
Новичок
Регистрация: 18.04.2009
Сообщений: 18
С нами: 8981197

Репутация: 0
По умолчанию

может, использовать ssh-клиента в пакетном режиме (batch mode)?
 
Ответить с цитированием

  #3  
Старый 04.08.2009, 15:09
papenkin
Новичок
Регистрация: 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) и пускаешь. Должно робить.
ЗЫ. Писал из головы, но должно работать. На всякий случай сделай бекап.
 
Ответить с цитированием

  #4  
Старый 10.08.2009, 12:33
dig555
Постоянный
Регистрация: 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'
Скажите, пожалуйста, возможна ли такая команда? И для чего в примере символы



Код:


Код:
{} \;
 
Ответить с цитированием

  #5  
Старый 11.08.2009, 17:50
papenkin
Новичок
Регистрация: 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 нужен для "расщиренных" регэкспов, но не мешает обычным. Удачи!
 
Ответить с цитированием

  #6  
Старый 01.11.2009, 20:50
Zharptah
Новичок
Регистрация: 23.08.2009
Сообщений: 15
С нами: 8798481

Репутация: 0
По умолчанию

Короткий и работающий способ, даже если имена файлов содержат пробелы:

Код:


Код:
find директория с файлами -iname 'маска файлов' -print0 | xargs -0 -n 1 sed -i -e 's/исходная строка/требуемая строка/g'
 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.