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.