2

我有两个目录条目,a 和 b。之前,a 和 b 指向不同的 inode。之后,我希望 b 指向与 a 相同的 inode。我希望这是安全的——我的意思是如果我在某个地方失败了,b 要么指向它的原始 inode,要么指向 a inode。尤其是我不想以 b 消失而告终。

mv 在覆盖时是原子的。

当目的地已经存在时,ln 似乎不起作用。

所以看起来我可以说:

ln a tmp mv tmp b

如果发生故障,会留下一个“tmp”文件,这是不可取的,但不是灾难。

有一个更好的方法吗?

(我实际上想要做的是用包含该内容的单个 inode 替换具有相同内容的文件,在所有目录条目之间共享)

4

2 回答 2

1
 ln a tmp ; mv tmp b

正如您在问题中所说,实际上是原子地执行此操作的最快方法。

(吹毛求疵的角落:更快地将两个系统调用放在一个程序中)

于 2010-06-16T21:05:19.403 回答
1

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

似乎更好,因为如果ln失败,mv则不会执行(并且在失败时会弄乱stderr)。

于 2014-01-16T02:15:44.423 回答