encontre um arquivo e envie algum texto para ele

0

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?

    
por Piotr G 14.07.2017 / 14:11

2 respostas

0

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 .

    
por 14.07.2017 / 14:51
0

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,
  • o redirecionamento final é impedir que text_to_send apareça no seu terminal.
por 14.07.2017 / 15:08

Tags