Substitua o arquivo por hardlink para outro arquivo atomicamente
-
23-09-2019 - |
Pergunta
Eu tenho duas entradas de diretório, a e b. Antes, A e B apontam para diferentes inodos. Depois, quero que B aponte para o mesmo inode que A. Eu quero que isso seja seguro - pelo que quero dizer, se eu falhar em algum lugar, B aponta para o inode original ou o inode. Especialmente, não quero acabar com B desaparecendo.
MV é atômico ao substituir.
LN parece não funcionar quando o destino já existe.
Parece que posso dizer:
Ln A TMP MV TMP B
O que, em caso de falha, deixará um arquivo 'TMP', o que é indesejável, mas não um desastre.
Existe uma maneira melhor de fazer isso?
(O que estou realmente tentando fazer é substituir arquivos com conteúdo idêntico por um único inode contendo esse conteúdo, compartilhado entre todas as entradas de diretório)
Solução
ln a tmp ; mv tmp b
é de fato a maneira mais rápida de fazê -lo atomicamente, como você declarou em sua pergunta.
(Nitpickers Corner: mais rápido para fazer as duas chamadas do sistema em um programa)
Outras dicas
ln a tmp && mv tmp b || rm tmp
parece melhor, como então se ln
falha, o mv
não será executado (e desgastará quando falhar).