sostituire il file con collegamento reale a un altro file atomicamente
-
23-09-2019 - |
Domanda
Ho due voci di directory, A e B. Prima, A e B per diversi inode. In seguito, voglio B al punto allo stesso inode come fa. Voglio che questo per essere sicuri - e con questo intendo se fallisco qualche parte, b sia punti al suo inode originale o un inode. soprattutto non voglio finire con b scomparsa.
mv è atomica quando sovrascrivere.
appare ln non funzionare quando la destinazione è già esistente.
così sembra che posso dire:
ln un tmp mv tmp b
, che in caso di guasto lascerà un file 'tmp' in giro, che è indesiderabile, ma non un disastro.
C'è un modo migliore per fare questo?
(quello che sto effettivamente cercando di fare è sostituire i file che hanno un contenuto identico con un unico inode contenente tale contenuto, condivisa tra tutte le voci di directory)
Soluzione
ln a tmp ; mv tmp b
è in realtà il modo più veloce per farlo atomicamente, come lei ha affermato nella sua interrogazione.
(Nitpickers angolo: più veloce di inserire entrambe le chiamate di sistema in un unico programma)
Altri suggerimenti
ln a tmp && mv tmp b || rm tmp
sembra migliore, come allora se ln
non riesce, non verrà eseguito il mv
(e ingombrare stderr quando fallisce).