Ru-Board.club
← Вернуться в раздел «Microsoft Windows»

» Поиск и замена в дереве каталогов под unix

Автор: Magi
Дата сообщения: 30.05.2004 02:16
Есть такая программка поиска и замены с исходниками
http://gnuwin32.sourceforge.net/packages/gsar.htm
Вот примерная строка запуска.

gsar -s"что менять" -r"на что менять" *.* -o

Но у нее есть недостаток - не ищет рекурсивно по дереву каталогов.
Была у меня как-то комбинация с find для запуска рекурсивно, но потерялась и не могу вспомнить и найти. Подскажите пожалуйста, как можно gsar по дереву пустить?
Автор: ooptimum
Дата сообщения: 30.05.2004 12:33
find . -type f -name * -exec gsar [parameters] {} \;
Только нафик этот gsar нужен, если есть более "родные" утилиты? Я бы пользовался sed'ом.
Автор: lynx
Дата сообщения: 30.05.2004 12:34
Magi

Я перлом делала.

>cd папка
>/usr/bin/perl -i.bak -p -e '/s/что_меняем/на_что_меняем/gi;' ./*
или:
>/usr/bin/perl -i.bak -p -e '/s/что_меняем/на_что_меняем/gi;' путь_к_файлам
можно не создавать bak-файлы:
>/usr/bin/perl -p -e '/s/что_меняем/на_что_меняем/gi;' путь_к_файлам






Добавлено
ooptimum

Цитата:
Я бы пользовался sed'ом.


Покажи, как.
Автор: ooptimum
Дата сообщения: 30.05.2004 12:42
lynx
Вам волю дай только, все перлом делать будете...

Добавлено
Показываю:
find . -type f -name * -exec sed -i 's:"что меняем":"на что меняем":' {} \;
Вот, например, так.

Добавлено
А еще лучше grep'ом искать, если "что меняем" встречается не в каждом файле. А потом в for-цикле изменять найденные файлы.
Автор: Magi
Дата сообщения: 30.05.2004 14:13
Perl'ом нужно спецсимволы закомментировать, что неудобно, когда в строках их много, sed при задании маски *.* фигачит все файлы, в том числе и бинарные и BerkeyDB у меня уже один раз запортил.

# find . -type f -name * -exec "gsar -s"www.domain.ru" -r"domain.ru" *.shtml -o" {} \;
find: 100: unknown option

FreeBSD 4.8
Автор: ooptimum
Дата сообщения: 30.05.2004 14:48
Magi

Цитата:
find: 100: unknown option

Разве я тебе писал, чтобы ты gsar свой в кавычки заключала? Посмотри внимательно, что я написал и что ты.


Цитата:
sed при задании маски *.* фигачит все файлы

Аналогично. Разве я тебе писал использовать с sed'ом маску "*.*"? Хотя ты сама эту же самую маску используешь с gsar'ом.

Идеология Unix: одна функция -- одна команда. Из вот таких вот функций-команд ты уже составляешь "программу", которая тебе нужна. В твоем случае задача легко раскладывается на следующие подзадачи: "найти" и "изменить все найденное". "изменить все найденное", в свою очередь, раскладывается на: "перебрать найденное" и "изменить". Теперь имеем такое сопоставление между подзадачами и командами, которые будем использовать: "найти" -- grep, "перебрать найденное" -- for и "изменить" -- sed. Собираем все вместе:

Код: for f in `grep -r "что ищем" *`; do sed -i 's:"что меняем":"на что меняем":' $f; done
Автор: Magi
Дата сообщения: 30.05.2004 17:10
ooptimum
Я вообще-то он
Кавычки - это от безысходности. Пробовал и с ними и без них и с апострофами - ошибка та же.
Там на странице есть ссskrf на исходники из которых я их скомпилировал под FreeBSD
http://aleron.dl.sourceforge.net/sourceforge/gnuwin32/gsar-1.11-src.zip
Автор: ooptimum
Дата сообщения: 30.05.2004 18:51
Magi

Цитата:
Я вообще-то он

Оп-ля... Я думал о такой возможности, но у меня есть несколько знакомых противоположного пола с таким же или крайне похожим ником (maggy и т.д.), так что я эту возможность отмел, как несущественную. Сорри, если что... Исправить вверху?


Цитата:
Пробовал и с ними и без них и с апострофами - ошибка та же.

Сегодня попозже попробую под фрей. У тебя шелл какой во фре? Это может быть существенно. Я писал под [ba]sh.

Добавлено
Кстати, команда
Цитата:
for f in `grep -r "что ищем" *`; do sed -i 's:"что меняем":"на что меняем":' $f; done
что, не работает у тебя?
Автор: Magi
Дата сообщения: 30.05.2004 20:06
ooptimum

Цитата:
Исправить вверху?

Да ладно, не обязательно

Цитата:
Сегодня попозже попробую под фрей. У тебя шелл какой во фре? Это может быть существенно. Я писал под [ba]sh.

Я под csh пробовал.
под bash и sh
#find . -type f -name *.shtml -exec gsar -s"www.domain.ru" -r"domain.ru" {} -o \;
find: No match.


Автор: ooptimum
Дата сообщения: 30.05.2004 21:03
Magi

Цитата:
find: No match.

А если вместо "-name *.shtml" попробовать "-iname *html"?
Автор: Magi
Дата сообщения: 01.06.2004 08:46
То же самое
Автор: f_serg
Дата сообщения: 01.06.2004 10:53
Magi

Цитата:
#find . -type f -name *.shtml -exec gsar -s"www.domain.ru" -r"domain.ru" {} -o \;
find: No match.

По-хорошему спецсимволы надо экранировать.
Попробуй так:

Код: #find . -type f -name '*.shtml' -exec gsar -s"www.domain.ru" -r"domain.ru" {} -o \;
Автор: ooptimum
Дата сообщения: 01.06.2004 13:38
f_serg

Цитата:
По-хорошему спецсимволы надо экранировать.

В данном случае звездочку не нужно экранировать.

Magi
У тебя вообще команда `find . -type f -name *html` что-нибудь выводит? Т.е. находит файлы, заканчивающиеся на "html"?
Автор: Magi
Дата сообщения: 01.06.2004 16:10
f_serg
Спасибо!
Вот это find . -type f -name '*.shtml' -exec gsar -s"www.domain.ru" -r"domain.ru" {} -o \; заработало!
Автор: f_serg
Дата сообщения: 01.06.2004 16:40
ooptimum

Цитата:
В данном случае звездочку не нужно экранировать.

Смотря что за случай. А если в текущем каталоге есть файлы .shtml? Шелл немедленно раскроет шаблон и файнд получит маленько не то, что мы хотели.
Magi
Вот и чудненько.
Автор: ooptimum
Дата сообщения: 01.06.2004 17:57
f_serg
Хм. Я команду писал по памяти, не проверяя. Да, ты прав, экранировать надо.
Никто не знает столько, сколько я забыл...

Добавлено
Magi

Цитата:
Вот это find . -type f -name '*.shtml' -exec gsar -s"www.domain.ru" -r"domain.ru" {} -o \; заработало!

Тут только две кавычки от коллеги f_serg, а все остальное мое. Не забыл?

Страницы: 1

Предыдущая тема: XR9x - русский аналог Nano98


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.