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)

Foi útil?

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).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top