LINUX.ORG.RU

Подскажите по find и sed


0

0

Столкнулся ровно с той же проблемой:

удаление нужной строки: find . -name '*.php' -exec sed -i -e '/require/d' {} \;

После этой команды во всех файлах с расширением php были удалены строки require (и require_once тоже). Но данная команда принесла ещё один неприятный побочный эффект. Появились файлы-дублёры у тех файлов, в которых произвелось удаление. Т.е. появилось множество файлов с расширением php-e Их пришлось удалить второй командой: find . -name '*.php-e' -exec rm -Rf {} \;

Уверен, что замену строки в множестве файлов можно сделать одной командой и моя ошибка где-то в области sed'а, но найти её я так и не смог.

http://pravdinskiy.ru/node/630

У меня также после подобной команды создались дублеры с -e на конце. Где ошибка? Что-то надо заэкранить или в кавычки запихнуть?

★★★★★

Наверно надо -i поставить последней в команде.

mky ★★★★★
()

man sed
-i[SUFFIX], --in-place[=SUFFIX]

edit files in place (makes backup if extension supplied)

Ты сам в команде задаешь делать бэкап, ничего странного, что он ВНЕЗАПНО появляется.

redgremlin ★★★★★
()

параметр -i предполагает необязательный аргумент - суффикс для резервных копий. вот он -e как суффикс и воспринял.

ananas ★★★★★
()
Ответ на: комментарий от legolegs

нет. искать по всем вложенным каталогам

ananas ★★★★★
()
Ответ на: комментарий от legolegs

Две звездочки со слешем означают рекурсивный обход каталогов

redgremlin ★★★★★
()
Ответ на: комментарий от legolegs

вообще sed может принимать на вход больше чем 1 файл за раз, поэтому эти изыски с find и exec вообще по-моему излишни

zolden ★★★★★
()
Ответ на: комментарий от zolden

>вообще sed может принимать на вход больше чем 1 файл за раз, поэтому эти изыски с find и exec вообще по-моему излишни

Ну на баше можно

sed -i '/require/d' *.php */*.php */*/*.php */*/*/*.php

но это говнокод, вложенность то любая может быть.

legolegs ★★★★★
()
Ответ на: комментарий от legolegs

>Ну на баше можно

sed -i '/require/d' *.php */*.php */*/*.php */*/*/*.php

Не спорю, баш давно уже не рулит.

На самом деле я просто find и xargs не осилил, рекурсивным глоббингом в zsh всё как то спасаюсь...

zolden ★★★★★
()

надо внимательно читать маны

всем спасибо

Turbid ★★★★★
() автор топика
Ответ на: комментарий от legolegs

Я привёл пример для «на баше» && «не говнокод». Конечно, у zsh толще.

lodin ★★★★
()
Ответ на: некрасиво же от zolden

Спасибо тебе, добрый человек.
Благодаря твоему посту я сподвигся ознакомиться с фичами zsh.
Он охренителен.

xydo ★★
()
Ответ на: комментарий от redgremlin

Вот именно, в гнутом sed'е суффикс копии файла нужно задавать сразу после '-i', без пробела. А у топистартера, похоже, MacOS, во всяком случаее man говорит, что если делать:

-i -e
то будут появляться файлы с '-e' в конце, и правильно делать
-i '' -e

P.S. А правда, что ** в zsh могут довести до «Argument list too long» и Ъ это делать find+xargs?

mky ★★★★★
()
Ответ на: комментарий от mky

До «Argument list too long» может довести и простой ls *.gz в bash, я это неоднократно наблюдал. Как-то раз задавался этим вопросом - у меня в сусе ограничение на длину Argument list составляло ~2000 символов. Естественно это может случиться и в zsh с его рекурсивным глоббингом. И да, - интернеты говорят что правильно делать это с find+xargs, которые я к сожалению не осилил, либо в цикле, поэтому в случае типа:

zgrep foo *.tar.gz

zgrep:Argument list too long

делаю for i in *.tar.gz;zgrep foo $i

zolden ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.