Попробуй это:
sudo find /opt -name filename-*.conf -exec bash -c 'echo "text_to_send" > {}' \;
Это bash -c
необходимо для того, чтобы поставить редирект >
в кавычки для find -exec
.
Я хотел бы найти файл в папке /opt
и отправить ему текст. Я попробовал следующий синтаксис:
sudo find /opt -name filename-*.conf | xargs -I '{}' echo "text_to_send" > '{}' \;
К сожалению, после этого я нахожу файл с именем, {}
который содержит текст. Я пробовал использовать '{}'
так же, как {}
, "{}"
, \{\}
, но в команде, но ничего, кажется, правильно работать в качестве заполнителя для найденного файла. Какой правильный синтаксис?
Попробуй это:
sudo find /opt -name filename-*.conf -exec bash -c 'echo "text_to_send" > {}' \;
Это bash -c
необходимо для того, чтобы поставить редирект >
в кавычки для find -exec
.
Я думаю, что >
интерпретируется в текущей оболочке. То же самое относится к *
, то есть, если у вас есть filename-A.conf
(или еще хуже: больше совпадающих файлов) в текущем каталоге, то глобализация оболочки нарушит вашу команду в дальнейшем. Также обратите внимание: ваше sudo
относится find
только к, а не к xargs
.
Попробуйте это (с sudo
при необходимости):
find /opt -name 'filename-*.conf' -print0 | xargs -r0 sh -c 'echo "text_to_send" | tee "$0" "$@"' > /dev/null
Предупреждение: tee
перезапишет файлы (как это >
делает, так что я думаю, это то, что вы хотите); использовать tee -a
для добавления.
find -print0
и xargs -0
работать даже с модными именами файлов,xargs -r
не запускается, если файл не найден,sh
обрабатывает внутреннюю трубу,$0" "$@"
передает все имена файлов (после xargs
) sh
безопасным способом в командуtee
обрабатывает один или несколько найденных файлов,text_to_send
появление в вашем терминале.