Procura e substitui arquivos

5

Encontrei o seguinte pequeno script no link

  

$ find / home / bruno / old-friends -tipo f -exec sed -i   's / ugly / beautiful / g' {} \;

Mas eu realmente não entendo o bit final

  

{} \;

Alguém poderia me explicar?

Obrigado!

    
por Pomario 16.07.2012 / 17:26

3 respostas

4

Este não é exatamente um problema de sintaxe sed , é um problema de sintaxe find .

O {} é um contêiner que substituirá o nome do arquivo que está sendo processado pelo comando sed .

Se você usa find assim:

$ find . -type f -name *.py -exec head {} \;

Isso localizará scripts Python e mostrará a cabeça de cada arquivo. Se você tiver três scripts no diretório atual:

  • 1.py
  • 2.py
  • 3.py

O {} conterá cada nome de arquivo e executará o comando head em cada arquivo.

O argumento -exec precisa de ; no final para poder reconhecer o final dos argumentos do comando ( sed neste caso), mas, para proteger ; da expansão, é necessário escapar dele com o \ .

Lembre-se de que você pode executar vários comandos por vez se usar o ; :

$ ls; pwd;

Isso listará os diretórios ( ls ) e imprimirá seu diretório de trabalho ( pwd ). O argumento -exec também precisa de ; . Mas como você não quer confundir o ; que separa comandos com o ; que faz parte do argumento -exec de find , você precisa escapar com o \ .

Como alternativa, você pode usar aspas em torno do ; :

$ find /home/bruno/old-friends -type f -exec sed -i 's/ugly/beautiful/g' {} ";"

Espero ter deixado claro

    
por César 16.07.2012 / 17:50
1

Eu tenho usado uma página do about.com Linux por um tempo que abrange

  

find - procura por arquivos em uma hierarquia de diretórios

como referência por um tempo e cobre a parte do comando sobre o qual você está perguntando.

find . -type f -exec file '{}' \;

Executa o 'arquivo' em todos os arquivos dentro ou abaixo do diretório atual. Observe que as chaves são colocadas entre aspas simples para protegê-las da interpretação como pontuação do script de shell. O ponto-e-vírgula é protegido da mesma forma pelo uso de uma barra invertida, embora ';' poderia ter sido usado nesse caso também.

Então, acho que seu comando deve ter ponto-e-vírgula ao redor dos seus aparelhos apenas para estar seguro.

Links de referência:

Artigo explicando o comando de localização

    
por CoalaWeb 16.07.2012 / 18:11
0

Com exec (e não xargs), o {} deve ser incluído à medida que é substituído pelo nome do arquivo que é direcionado pelo comando find; é um espaço reservado normalmente citado de forma que, se algum arquivo de destino contiver espaços, o comando ainda será executado com êxito em todos os arquivos. O semicolon deve ser incluído quando termina o comando, assim como ao separar vários comandos na linha de comando. Tem que ser escaped neste caso para que o comando find o receba do shell unexpanded (como um literal). Há muitos tutoriais sobre isso on-line, veja, por exemplo, este artigo útil.

Outro artigo excelente e realmente essencial é o site do Wooledge que explica muito bem o comando de localização, exec e a importância de citar vários elementos em seu comando ou script. Eu descobri que o artigo e o site como um todo são muito úteis para aprender scripts de bash e bash.

    
por user76204 16.07.2012 / 17:57

Tags