Existem duas estratégias para substituir um arquivo por uma nova versão:
Crie um arquivo temporário com a nova versão e mova-o para o lugar.
- Vantagem: se um programa abrir esse arquivo, ele lerá o conteúdo antigo ou o novo, dependendo de ter aberto o arquivo antes ou depois da mudança. Não há confusão.
- Vantagem: em caso de falha, o conteúdo antigo é preservado.
- Desvantagem: como um novo arquivo é criado, os atributos do arquivo (propriedade, permissão etc.) não são preservados.
Substitua o arquivo antigo no local.
- Vantagem: os atributos do arquivo são preservados.
- Desvantagem: em caso de falha, o arquivo pode ser deixado pela metade.
- Desvantagem: se um programa tem o arquivo aberto quando está sendo atualizado, esse programa pode ler dados inconsistentes.
Se você puder, use o método 1, mas primeiro replique os atributos do arquivo original com cp -p --attributes-only
. Isso requer GNU coreutils (ou seja, Linux não incorporado ou ambientes suficientemente semelhantes ao Linux). Se o seu cp
não tiver --attributes-only
, omita esta opção: funcionará, mas replicará os dados também.
tmp=$(mktemp)
cp -p --attributes-only "$original" "$tmp"
modifyfile "$original" "$tmp"
mv -f "$tmp" "$original"
Se você não puder replicar os atributos do arquivo existente, por exemplo, porque você possui permissões de gravação, mas não o possui e deseja preservar o proprietário, apenas o método 2 é possível. Para minimizar o risco de perda de dados:
- Faça com que a janela durante a qual o arquivo fique incompleto seja o menor possível. Prepare os dados primeiro em um arquivo temporário e copie-os no lugar.
- Faça um backup do arquivo antigo primeiro.
tmp=$(mktemp)
backup="${original}~"
modifyfile "$original" "$tmp"
cp -p "$original" "$backup"
cp -f "$tmp" "$original"