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

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

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

./convert /path/to/file

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

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

Responder1

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 cada arquivo em uma árvore de diretórios, use ofindUtilitário. Como você precisa executar um comando complexo para cada arquivo, é necessário invocar explicitamente um shell.

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

Responder2

A questão à qual você vinculou não opera recursivamente, funciona apenas em um nível de profundidade. Para recursão, use find:

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

Você deseja sair convertda árvore em que está andando, correndo o risco de ela tentar se modificar.

Responder3

Se bem entendi, você deseja substituir cada arquivo de entrada pelo resultado convertdesse 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

Responder4

Pegando emprestado do excelente @Gillesresponder:

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

Eu tentei o acima com sed, funcionou.

informação relacionada