2

I have two directory entries, a and b. Before, a and b point to different inodes. Afterwards, I want b to point to the same inode as a does. I want this to be safe - by which I mean if I fail somewhere, b either points to its original inode or the a inode. most especially I don't want to end up with b disappearing.

mv is atomic when overwriting.

ln appears to not work when the destination already exists.

so it looks like i can say:

ln a tmp mv tmp b

which in case of failure will leave a 'tmp' file around, which is undesirable but not a disaster.

Is there a better way to do this?

(what I'm actually trying to do is replace files that have identical content with a single inode containing that content, shared between all directory entries)

Ben Clifford
  • 1,398
  • 1
  • 12
  • 23

2 Answers2

1

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

seems better, as then if ln fails, the mv will not get executed (and clutter up stderr when it fails).

mtd
  • 2,224
  • 19
  • 21
1
 ln a tmp ; mv tmp b

is in fact the fastest way to do it atomically, as you stated in your question.

(Nitpickers corner: faster to place both system calls in one program)

Joshua
  • 40,822
  • 8
  • 72
  • 132