Tente isto:
sudo find /opt -name filename-*.conf -exec bash -c 'echo "text_to_send" > {}' \;
O bash -c é necessário para colocar o redirecionamento > entre aspas para find -exec .
Eu gostaria de encontrar um arquivo na pasta /opt e enviar algum texto para ele. Eu tentei a seguinte sintaxe:
sudo find /opt -name filename-*.conf | xargs -I '{}' echo "text_to_send" > '{}' \;
Infelizmente, depois disso, encontro o arquivo chamado {} , que contém o texto. Eu tentei usar '{}' , bem como {} , "{}" , \{\} , mas no comando, mas nada parece funcionar corretamente como um espaço reservado para o nome do arquivo encontrado. Qual é a sintaxe correta?
Tente isto:
sudo find /opt -name filename-*.conf -exec bash -c 'echo "text_to_send" > {}' \;
O bash -c é necessário para colocar o redirecionamento > entre aspas para find -exec .
Acho que > é interpretado no shell atual. O mesmo se aplica a * , ou seja, se você tiver filename-A.conf (ou pior: mais arquivos correspondentes) no diretório atual, a shell globbing quebrará seu comando mais longe. Além disso, observe que seu sudo se aplica apenas a find , não a xargs .
Tente isso (com sudo , se necessário):
find /opt -name 'filename-*.conf' -print0 | xargs -r0 sh -c 'echo "text_to_send" | tee "$0" "$@"' > /dev/null
Aviso: tee sobrescreverá arquivos (como > , então acho que é isso que você quer); use tee -a para acrescentar.
find -print0 e xargs -0 funcionam mesmo com nomes de arquivo extravagantes, xargs -r não é executado se nenhum arquivo for encontrado, sh manipula o tubo interno, $0" "$@" passa todos os nomes de arquivos (postpended por xargs ) para o comando em sh de maneira segura, tee lida com um ou vários arquivos encontrados, text_to_send apareça no seu terminal.