Saya mencoba (sedekat mungkin) secara atom mengubah symlink. Saya sudah mencoba:
ln -sf other_dir existing_symlink
Itu baru saja meletakkan symlink baru di direktori yang menunjuk existing_symlink.
ln -sf other_dir new_symlink
mv -f new_symlink existing_symlink
Itu melakukan hal yang sama: itu memindahkan symlink ke direktori.
cp -s other_dir existing_symlink
Itu menolak karena itu adalah direktori.
Saya pernah membaca bahwa mv -T
ini dibuat untuk ini, tetapi busybox tidak memiliki -T
benderanya.
ln -snf
), tetapi masih ada dua panggilan sistem di bawah tenda.Ini dapat memang dilakukan atom dengan
rename(2)
, dengan terlebih dahulu menciptakan symlink baru di bawah nama sementara dan kemudian bersih Timpa symlink lama dalam satu pergi. Seperti yang dinyatakan halaman manual :Dalam shell, Anda akan melakukan ini dengan cara
mv -T
sebagai berikut:Anda dapat
strace
perintah terakhir itu untuk memastikan memang menggunakan direname(2)
bawah kap:Perhatikan bahwa di atas, keduanya
mv -T
danstrace
Linux-spesifik.Di FreeBSD, gunakan secara
mv -h
bergantian.sumber
rename
syscall secara langsung, bukanmv -h
ataumv -T
. Misalnya dengan Perl:perl -e 'rename "z.new", "z" or die $!'
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 danmv
itu ke dalam direktori induk dari target Anda:Contoh kode diambil melalui ( http://axialcorps.wordpress.com/2013/07/03/atomically-replacing-files-and-directories/ )
sumber
Sudahkah Anda mencoba
ln -snf
?Opsi
-n
menimpa tujuan daripada menulis di bawahnya ketika tujuan adalah tautan simbolis ke direktori.Bersulang
sumber
ln -snf
bukan atomik: itu membatalkan tautan tujuan, lalu membuat symlink yang diinginkan.