Aplicar recursivamente um comando para modificar todos os arquivos em um diretório

5

Eu tenho um comando que lê um arquivo e gera uma versão modificada em stdout :

./convert /path/to/file

Como posso recursivamente aplicar este comando a todos os arquivos em um diretório, e substituir o conteúdo existente de cada arquivo com o resultado do comando acima ?

Eu encontrei esta pergunta , que é muito semelhante, mas todas as soluções oferecidas envolvem a saída dos resultados em um único arquivo, que não é o que eu quero.

    
por Benjamin 15.10.2013 / 17:15

4 respostas

5

Se bem entendi, você pode converter um arquivo com

./convert /path/to/file >/path/to/file.new
mv /path/to/file.new /path/to/file

Para aplicar um comando a todos os arquivos em uma árvore de diretórios, use o utilitário find . Como você precisa executar um comando complexo para cada arquivo, é necessário invocar um shell explicitamente.

find /path/to/top/directory -type f -exec sh -c '
  /path/to/convert "$0" >"$0.new" &&
  mv "$0.new" "$0"
' {} \;
    
por 16.10.2013 / 03:46
2

A pergunta que você vinculou não opera recursivamente, ela funciona apenas em um nível. Para recursão, use find :

find . -type f -exec /path/to/convert {} \;

Você quer mover convert para fora da árvore em que está andando, correndo o risco de tentar se modificar.

    
por 15.10.2013 / 17:18
2

Se bem entendi, você deseja sobrescrever cada arquivo de entrada com o resultado de convert nesse arquivo de entrada. Se sim, tente isto:

find . -type f | while IFS= read -r file; do
  ./convert "$file" > /tmp/foo.tmp && mv /tmp/foo.tmp "$file";
done
    
por 15.10.2013 / 17:49
0

Empréstimo da resposta do @Gilles:

find /path/to/top/directory -type f -exec sh -c '/path/to/convert "$0" | tee "$0"' {} \;

Eu tentei o acima com sed , funcionou.

    
por 17.10.2013 / 15:53

Tags