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

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

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

2 ответа2

0

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

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

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

0

Я думаю, что > интерпретируется в текущей оболочке. То же относится и к * , т. Е. Если у вас есть 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 в вашем терминале.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .