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年半ぐらい?)社内用に書いてたメモからのコピペ。