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
команда за комментарий Квисси.