Ini bisa memang dilakukan secara atomik dengan rename(2)
, dengan terlebih dahulu membuat symlink baru dengan nama sementara dan kemudian dengan bersih menimpa symlink lama sekaligus. Seperti yang dinyatakan halaman manual:
Jika jalur baru mengacu pada tautan simbolik, tautan tersebut akan ditimpa.
Di shell, Anda akan melakukan ini dengan mv -T
sebagai berikut:
$ mkdir a b
$ ln -s a z
$ ln -s b z.new
$ mv -T z.new z
Anda dapat strace
perintah terakhir untuk memastikan bahwa memang menggunakan rename(2)
di bawah tenda:
$ strace mv -T z.new z
lstat64("z.new", {st_mode=S_IFLNK|0777, st_size=1, ...}) = 0
lstat64("z", {st_mode=S_IFLNK|0777, st_size=1, ...}) = 0
rename("z.new", "z") = 0
Perhatikan bahwa di atas, keduanya mv -T
dan strace
khusus untuk Linux.
Di FreeBSD, gunakan mv -h
secara bergantian.
Mengambil di mana Arto tinggalkan di sini, ini sepenuhnya mungkin, bahkan tanpa mv -T
, Anda hanya perlu membuat symlink baru dengan nama yang sama dengan direktori target dan mv
ke direktori induk target Anda:
mkdir -p tmp/real_dir1 tmp/real_dir2
touch tmp/real_dir1/a tmp/real_dir2/a
# start with ./target_dir pointing to tmp/real_dir1
ln -s tmp/real_dir1 target_dir
# create a symlink named target_dir in tmp, pointing to real_dir2
ln -sf tmp/real_dir2 tmp/target_dir
# atomically mv it into ./ replacing ./target_dir
mv tmp/target_dir ./
Contoh kode diambil melalui (http://axialcorps.wordpress.com/2013/07/03/atomically-replacing-files-and-directories/)
Sudahkah Anda mencoba ln -snf
?
Opsi -n
menimpa tujuan alih-alih menulis di bawahnya ketika tujuannya adalah tautan simbolis ke direktori.
Salam