cara memperbarui target tautan simbolis (ln -f -s tidak berfungsi)

45

saya menggunakan

ln -f -s / var / www / html / rilis / build1390 aplikasi-saat ini

untuk memperbarui tautan simbolik "saat ini" dengan tujuan baru. Namun, ini tidak berhasil, tautan "app-current" menyimpannya sebagai tujuan awal, namun, saya tidak mendapatkan kesalahan ...

Saya lebih suka tidak menghapus tautan dan membuatnya kembali, cukup perbarui target tautan yang ada. Apakah itu mungkin?

solsol
sumber

Jawaban:

55

Itu bekerja untuk saya, apa hasilnya strace ln -f -s /var/www/html/releases/build1390 app-current?

Oh, karena ini adalah direktori yang perlu Anda tambahkan -ntanpa dereferensi dan ini harus menyelesaikan masalah. -fbenar-benar lebih nyaman karena menambahkan -f hanya menyebabkannya memutuskan tautan. Walaupun saya kira itu mungkin akan terjadi beberapa ratus ms lebih cepat pada sistem yang biasanya dimuat.

Misalnya, jika ARF sudah menunjuk ke / home:

strace Dengan -n:

strace ln -n -f -s / arf
...
symlink("/", "arf")           = -1 EEXIST (File exists)
unlink("arf")                           = 0
symlink("/", "arf")           = 0

strace Tanpa -n:

strace ln -f -s / arf
...
write(2, "ln: "..., 4ln: )                  = 4
write(2, "`arf/': cannot overwrite director"..., 34`arf/': cannot overwrite directory) = 34
write(2, "\n"..., 1)                    = 1

Jadi tanpa -narf akan direferensi, maka memperlakukannya seolah-olah itu sebenarnya /. Dalam contoh khusus Anda, jika tidak ada kesalahan, saya pikir Anda mungkin telah membuat tautan simbolis baru di dalamnya /var/www/html/releases/build1390 app-currentdan ingin membersihkannya.

Kyle Brandt
sumber
4
Hebat, itu -n yang melakukannya. Terima kasih banyak!
solsol
12

Anda dapat menggunakan -natau --no-dereferenceuntuk mencegah target dari dereferensi jika itu adalah symlink. Anda juga dapat menggunakan -Tatau --no-target-directoryuntuk memastikan bahwa file target akan selalu diperlakukan sebagai file biasa.

Ini menghasilkan perilaku yang sedikit berbeda, seperti yang ditunjukkan contoh berikut. Misalkan srcbeberapa file, dirlinkadalah symlink ke direktori, dan dirmerupakan direktori aktual.

Menggunakan -n:

  • ln -sfn src dirlinkmenimpa dirlinkdan menautkannya kesrc
  • ln -sfn src dir menciptakan tautan dir/src -> src

Menggunakan -T:

  • ln -sfT src dirlinkmenimpa dirlinkdan menautkannya kesrc
  • ln -sfT src dir menghasilkan pesan kesalahan: ln: ‘dir’: cannot overwrite directory
augurar
sumber
1
memiliki jawaban yang paling benar dan ringkas untuk pengguna Linux.
ross
Apakah ada cara untuk memaksa menimpa direktori target sehingga Anda tidak akan mendapatkan pesan kesalahan cannot overwrite directory?
gitaarik
@rednaw Anda dapat melakukan ini dengan merantai beberapa perintah, tetapi lnitu sendiri tidak menghapus direktori - ini mungkin akan menjadi ide yang buruk, karena itu akan membutuhkan secara rekursif menghapus mungkin sejumlah besar file.
augurar