find: отсутствует аргумент `-exec', даже после экранирования точки с запятой

for i in `ls`; do find /path/to/different/project -name $i -type f -exec sed -i "s/var Handlebars/d" {}; done;

Я пытался, казалось бы, все, в том числе избежать ; после {}, избегая обоих ;Избегаю цитаты, подправляя sed Команда - все безрезультатно. Что дает?

3 ответа

Решение

(Не используйте for i in ls, Он потерпит неудачу, если любое имя файла содержит пробелы, и это не нужно. for i in * делает именно то, что вы хотите, без необходимости подпроцесса.)

Правильный синтаксис:

for fn in *; do
  find /path/ -name "$fn" -type f -exec sed ... {} \; ;
done  

\; это аргумент, чтобы найти. И то и другое {} а также ; должны появляться как отдельные аргументы; если вы используете {}\; оболочка объединит их в один аргумент и find будет рассматривать это как простой аргумент sed,

Второй ; метасимвол оболочки, который завершает find команда. Написано, как указано выше, в три строки ; Это не нужно, но если вы хотите, чтобы в одной строке, это было необходимо. Если вы избежите этого, как \;, он перестает быть метасимволом оболочки и просто передается find в качестве аргумента, где это приведет к ошибке.

Команда sed, как написано, потерпит неудачу, так как sed ожидает 2 аргумента для команды s. Вы пытаетесь удалить все строки, где существуют "var Handlebars", если так, то правильный путь (с помощью sed) будет

sed '/^.*var Handlebars.*$/d'

который говорит "удалить (команда 'd', чтобы sed) любую строку, которая содержит строку 'var Handlebars'"

Якоря ^ и $ - начало строки и конец строки соответственно, где ".*" Означает ноль или более любого символа до и после строки "var Handlebars".

поэтому ваша составная команда теперь становится:

for i in *; do find /path/ -name "$i" -type f -exec sed -i '/^.*var Handlebars.*$/d' {} \; done

Вопрос был двояким. rici был прав, что должна была быть лишняя точка с запятой, но после этого она все еще не работала, если между символом пробела не было {} и \;, Последняя команда выглядит так:

for i in `ls`; do find /path/to/different/project -name $i -type f -exec sed -i "/var Handlebars/d" {} \;; done;

Примечание: я также удалил s (замена) из sed команда за комментарий Квисси.

Другие вопросы по тегам