
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 ofind
Utilitá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 convert
da á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 convert
desse 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.