Bagaimana cara menimpa tautan simbolis dari suatu direktori?

15

Ada dua direktori foo1dan foo2.

Awalnya saya membuat direktori symlink dengan ln -s foo1 bar. Setelah itu saya ingin mengubah symlink, jadi saya mengetikln -sf foo2 bar

Tetapi barmasih terkait dengan foo1. Symlink foo2dibuat di dalam foo1.

Apa yang harus saya ketik ketika saya ingin mengganti foo1dengan foo2?

Saya menguji di tiga lingkungan.

  1. Ubuntu 12.04, ln (GNU coreutils) 8.13
  2. CentOS 6.4, ln (GNU coreutils) 8.4
  3. OS X 10.7.5, ln (tanpa versi)
pasir besi
sumber

Jawaban:

17

Cara yang tepat untuk melakukan ini adalah dengan menggunakan -n, --no-dereferenceopsi seperti itu.

$ ln -snf foo2 bar

Ini menyebabkan lnuntuk memperlakukan symlink yang ada sebagai file. Kalau tidak, itu referensi barke foo1, turun ke foo1dan menggunakan TARGETnama asli sebagai LINK_NAMEdan itu sebabnya Anda berakhir dengan symlink untuk foo2dibuat di dalam foo1direktori. Halaman manual lnmenyatakan berikut ...

-n, --tidak ada dereferensi
       memperlakukan LINK_NAME sebagai file normal jika itu adalah tautan simbolis ke a
       direktori

Di bawah ini adalah output shell pada desktop Arch Linux saya dengan versi 8.21 lndengan dan tanpa --no-dereferenceopsi, saya mendapatkan hasil yang sama seperti yang Anda lakukan tanpa --no-dereferenceopsi, tetapi menggunakan --no-dereferenceopsi itu berfungsi seperti yang diharapkan.

$ mkdir foo1 foo2
$ ln -s foo1 bar
$ ls -l bar
  lrwxrwxrwx 1 drew users 4 Sep 17 12:51 bar -> foo1
$ ln -sf foo2 bar
$ ls -l bar
  lrwxrwxrwx 1 drew users 4 Sep 17 12:51 bar -> foo1
$ ls -l foo1
  total 0
  lrwxrwxrwx 1 drew users 4 Sep 17 12:51 foo2 -> foo2
$ ln -snf foo2 bar
$ ls -l bar
  lrwxrwxrwx 1 drew users 4 Sep 17 12:52 bar -> foo2
Drew Chapin
sumber
Terima kasih atas jawaban anda. Jika itu masalah yang tergantung lingkungan, saya akan menulis lingkungan saya. OS mana yang Anda gunakan? output apa ln --version?
ironsand
Saya mencoba ini pada Fedora 18 VM dengan versi 8.17. Menariknya, saya mencoba ini di desktop Arch Linux saya dengan versi 8.21 dan mendapatkan hasil yang sama dengan yang Anda lakukan. Sepertinya di suatu tempat di antara kedua versi itu ada yang berubah. Solusi yang saya posting berhasil di kedua contoh.
Drew Chapin
FYI, saya menemukan jawaban ini di forum justlinux.com .
Drew Chapin
Terima kasih druciferre! Saya bahkan tidak pernah menyangka kalau lnperintah itu sering di-upgrade.
ironsand
Saya diuji di osx juga. lnberfungsi sama seperti ubuntu dan centos dengan direktori menimpa dan ln -snfmenyelesaikan masalah. Meskipun ln -hlebih suka opsi untuk digunakan di osx.
ironsand