найти файл и отправить ему текст

236
Piotr G

Я хотел бы найти файл в папке /optи отправить ему текст. Я попробовал следующий синтаксис:

sudo find /opt -name filename-*.conf | xargs -I '{}' echo "text_to_send" > '{}' \; 

К сожалению, после этого я нахожу файл с именем, {}который содержит текст. Я пробовал использовать '{}'так же, как {}, "{}", \{\}, но в команде, но ничего, кажется, правильно работать в качестве заполнителя для найденного файла. Какой правильный синтаксис?

0

2 ответа на вопрос

0
Zaroth

Попробуй это:

sudo find /opt -name filename-*.conf -exec bash -c 'echo "text_to_send" > {}' \; 

Это bash -cнеобходимо для того, чтобы поставить редирект >в кавычки для find -exec.

Спасибо, этот ответ технически приемлем, если он запускается в консоли, но, к сожалению, по какой-то причине он не работает для меня в контексте обеспечения, используемого в бродячем файле. Вагрант пожаловался на отсутствие атрибутов -exec. Piotr G 7 лет назад 0
0
Kamil Maciorowski

Я думаю, что >интерпретируется в текущей оболочке. То же самое относится к *, то есть, если у вас есть 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появление в вашем терминале.
Это решение работает даже в бродячем файле, но были некоторые проблемы с `text_to_send`, содержащим` "" `, которые были удалены в конце концов. Так что в конце концов мне пришлось прибегнуть к другому решению, но это все равно дало мне хорошее понимание, так что спасибо. Piotr G 7 лет назад 0