Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет old_apazhe ([info]old_apazhe)
@ 2005-11-13 06:06:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Чайнический впорос.
Как мне на машине с freebsd прочесать несколько сотен каталогов и заменить в лежащих в них файлах одну подстроку на другую?
Усложняя задачу: заменить подстроку на путь к этому файлу?

В виндах-то у меня утилитка есть...


(Добавить комментарий)


[info]aabp@lj
2005-11-13 00:26 (ссылка)
man sed
man find на предмет -exec

если сформулируешь более внятно - сваяю готовое

(Ответить) (Ветвь дискуссии)


[info]aabp@lj
2005-11-13 00:39 (ссылка)
[aabp@polygon 1]$ mkdir 1
[aabp@polygon 1]$ cd 1
[aabp@polygon 1]$ echo "stroka 1" > 123
[aabp@polygon 1]$ find `pwd` -type f -exec sed -i 's@stroka@stochka@g' {} \;
[aabp@polygon 1]$ cat 123
stochka 1

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]aabp@lj
2005-11-13 00:43 (ссылка)
[aabp@polygon 1]$ find `pwd` -type f -exec sed -i 's@stochka@{}@g' {} \;
[aabp@polygon 1]$ cat 123
/home/aabp/vrem/1/1/123 1

(Ответить) (Уровень выше)


[info]hottabych@lj
2005-11-13 00:30 (ссылка)

(Ответить)


[info]brohm@lj
2005-11-13 00:44 (ссылка)
find /путь/к/каталогам -type f -print0 | xargs -0 perl -p -i.bak -e 's/подстрока/$ARGV/g'
(линуксовое, но и под bsd сработает, скорее всего)
сохраняет старые файлы с расширением .bak, если это не нужно - просто -i вместо -i.bak

(Ответить) (Ветвь дискуссии)


[info]avnik@lj
2005-11-13 07:13 (ссылка)
Я бы к xargs еще -n1 добавил --- надежнее будет ;)

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]brohm@lj
2005-11-13 08:45 (ссылка)
С чего бы это?
Смысла запускать с -n 1 никакого нет, лучше тогда find .. -exec, польза от xargs именно в том что напускаем perl не на каждый отдельный файл а на много сразу.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]avnik@lj
2005-11-13 09:05 (ссылка)
Вот я только не уверен -- насколько -exec портабелен.
(и я не всегда помню не подглядывая в ман --- сожрет команда много файлов или нет)

(Ответить) (Уровень выше)


[info]avnik@lj
2005-11-13 09:10 (ссылка)
Я уверен что -exec работает хорошо в bsd и в linux, про другие системы не уверен. До соляры я прямо сейчас не дотянусь ;)

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]brohm@lj
2005-11-13 09:16 (ссылка)
В солярисе работает, конечно - это же классическая фича, без нее никак. А вот print0 и вообще xargs в каком-нибудь древнем юниксе может и не быть.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]avnik@lj
2005-11-13 09:23 (ссылка)
Вот на предмет отсутсвия xargs стоит задуматься.
Хотя у меня все таки древность ограничивается семеркой соляриса.

Но желание прибить в скрнипты к ksh уже есть --- потому как солярисовый --- мягко говоря странен. А то что expr пытается вернуть часть результата в rc? Все скрипты c /bin/sh -e разумеется на нем помиралли как мухи. || true добавлянтся к нему уже почти на автомате.

(Ответить) (Уровень выше)

Поэпигонствую
[info]oal@lj
2005-11-13 09:45 (ссылка)
> find /путь/к/каталогам -type f -print0 | xargs -0 perl -p -i.bak -e 's/подстрока/$ARGV/g'

for i in `find /каталог1 /каталог2 -type f`; do cp $i $i~; cat $i | sed -e 's/подстрока/заменить на это/g' > $i.tmp; mv $i.tmp $i; done

Не будет работать, если в именах файлов есть пробелы. Зато не требует перловки. Оставляет бейкап в filename.ext~.

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: Поэпигонствую
[info]brohm@lj
2005-11-13 09:55 (ссылка)
Угу, только если файлов много ("сотни каталогов") - работать тоже не будет.

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: Поэпигонствую
[info]oal@lj
2005-11-13 10:31 (ссылка)
Не то, чтобы я это проверял, но -- почему?

xargs не будет работать -- отраничение на количество параметров в ком.строке. А for что сделается?

(Ответить) (Уровень выше) (Ветвь дискуссии)

Re: Поэпигонствую
[info]brohm@lj
2005-11-13 13:45 (ссылка)
Все наоборот.

(Ответить) (Уровень выше)


[info]cunnilinux@lj
2005-11-13 16:48 (ссылка)
есть такая софтинка, называеццо rpl
спецом для этого

(Ответить)


[info]meksico@lj
2005-11-14 09:53 (ссылка)
А в виндах чем пользуешься? У самого вот прям сча стоит такое и нерешенное

(Ответить) (Ветвь дискуссии)

Re: Reply to your post...
[info]ex_ex_apazh@lj
2005-11-14 12:31 (ссылка)

опачки

проебал

:-(

(Ответить) (Уровень выше)


[info]rezdm@lj
2005-11-14 14:26 (ссылка)
Пользуюсь регулярно, у меня несколько скриптов отрабатывают, в т.ч.:
find -type f -name "--шаблон--" -exec --здесь имя скрипта который меняет-- {} --параметры для скрипта-- ;

Скрипт выглядит так:
#!/bin/sh

PATTERN='шаблон для поиска'

SEARCH_EXPR=/"$PATTERN"/p
REPLACE_EXPR='s/\('"$PATTERN"'\)/'"$2"'\\/g' <-- на что аменить (я передаю параметром

#sed -n "$SEARCH_EXPR" $1
sed "$REPLACE_EXPR" $1 > $1__ && mv $1 $1.bak && mv $1__ $1

Ну вот типа так.

(Ответить)