シンボリックリンクのアトミックな入れ替えの ln -sfn vs mv -Tf

WEB+DB Press vol.84 読んでて知った、シンボリックリンクのアトミックな入れ替え。

$ mkdir 1
$ touch 1/1.txt
$ mkdir 2
$ touch 2/2.txt
$ ln -s 1 cur
$ strace ln -sfn 2 cur
lstat("cur", {st_mode=S_IFLNK|0777, st_size=1, ...}) = 0
lstat("cur", {st_mode=S_IFLNK|0777, st_size=1, ...}) = 0
stat("2", {st_mode=S_IFDIR|0755, st_size=60, ...}) = 0
symlink("2", "cur")                     = -1 EEXIST (File exists)
unlink("cur")                           = 0
symlink("2", "cur")                     = 0
$ mkdir 3
$ touch 3/3.txt
$ ln -s 3 cur.tmp
$ strace mv -Tf cur.tmp cur
lstat("cur.tmp", {st_mode=S_IFLNK|0777, st_size=1, ...}) = 0
lstat("cur", {st_mode=S_IFLNK|0777, st_size=1, ...}) = 0
rename("cur.tmp", "cur")                = 0
:

前者は unlink -> symlink なのに対して後者は rename だけなので、つまり ln -sfn よりも mv -Tf の方がよりアトミック。


だいぶ前(1年半ぐらい?)社内用に書いてたメモからのコピペ。