2010-04-02 7 views
2

J'ai deux entrées de répertoire, a et b. Avant, a et b désignent différents inodes. Ensuite, je veux que b pointe vers le même inode qu'un do. Je veux que ce soit sûr - par lequel je veux dire si j'abuse quelque part, b soit pointe vers son inode d'origine ou de l'inode. surtout je ne veux pas finir avec b disparaissant.Remplacer le fichier par un lien physique vers un autre fichier de façon atomique

mv est atomique lors de l'écrasement. Ln semble ne pas fonctionner lorsque la destination existe déjà.

Il semble donc que je peux dire:

Dans un tmp mv tmp b

qui, en cas d'échec laissera un fichier « tmp » autour, ce qui est indésirable, mais pas une catastrophe.

Y a-t-il une meilleure façon de procéder?

(ce que je suis en train d'essayer de faire est de remplacer les fichiers qui ont un contenu identique à un seul inode contenant ce contenu, partagé entre toutes les entrées de répertoire)

Répondre

0
ln a tmp ; mv tmp b 

est en fait le moyen le plus rapide de le faire atomiquement, comme vous l'avez dit dans votre question.

(coin de Nitpickers: plus rapide à placer deux appels système dans un seul programme)

0

ln a tmp && mv tmp b || rm tmp

semble mieux, comme alors si ln échoue, le mv ne sera pas exécuté (et encombrer stderr quand il échoue).

Questions connexes