Bagaimana cara mengganti / memperbarui symlink?

188

Saya mencoba menggunakan tautan simbolis. Saya membaca dan menemukan perintah berikut:

Creation -> ln -s {/path/to/file-name} {link-name}
Update -> ln -sfn {/path/to/file-name} {link-name}
Deletion -> rm {link-name}

Kreasi dan penghapusan berfungsi dengan baik. Tetapi pembaruan tidak berfungsi. Setelah melakukan perintah ini, symlink menjadi tidak valid.

Saya telah membaca di sana-sini bahwa tidak mungkin untuk memperbarui / mengganti symlink. Jadi ada informasi yang saling bertentangan di internet. Siapa yang benar? Jika symlink dapat diperbarui / diganti, bagaimana saya bisa mencapai ini?

Memperbarui

Berikut adalah struktur direktori saya:

~/scripts/test/
~/scripts/test/remote_loc/
~/scripts/test/remote_loc/site1/
~/scripts/test/remote_loc/site1/stuff1.txt
~/scripts/test/remote_loc/site2/
~/scripts/test/remote_loc/site2/stuff2.txt
~/scripts/test/remote_loc/site2/
~/scripts/test/remote_loc/site3/stuff3.txt

Dari ~/scripts/test/, ketika saya melakukan:

ln -s /remote_loc/site1 test_link

a test_linkdibuat, dan saya bisa ls -l, tetapi tampaknya rusak (bertentangan dengan apa yang saya katakan di atas dalam pertanyaan saya).

Bagaimana saya bisa melakukan beberapa tautan level direktori?

Jérôme Verstrynge
sumber
1
Saya sarankan untuk menggunakan unlinkbukan rm. Dengan unlinkAnda tidak pernah berisiko kehilangan file dalam direktori sumber dengan secara tidak sengaja menggunakan sakelar yang salah.
Jpsy
Anda menggunakan perintah terdepan / dalam perintah Anda
Jamie Cook
@ jpsy saran Anda tentang pembatalan tautan akan sangat baik, jika itu benar . Coba sentuh zzzz; batalkan tautan zzzz. (batalkan tautan panggilan, batalkan tautan sama dengan rm, tetapi tanpa opsi mewah, dan tanpa rekursi).
ctrl-alt-delor
Kenapa menggunakan -n? (mungkin masalahnya). Juga jika ln Anda mendukung -tkemudian menggunakannya, untuk kasus ini, dan -Tatau destination/untuk kasus lain.
ctrl-alt-delor

Jawaban:

150

Menggunakan -fdengan lnakan menimpa tautan apa pun yang sudah ada di sana, jadi selama Anda memiliki izin yang benar, itu akan berfungsi ... Itu selalu bekerja untuk saya. Sistem operasi apa yang Anda gunakan?

Sirch
sumber
Saya telah memperbarui pertanyaan saya dengan informasi lebih lanjut tentang masalah saya.
Jérôme Verstrynge
Saya di bawah linux.
Jérôme Verstrynge
2
Jika Anda mengganti lnparameter, seperti yang cenderung saya lakukan, apakah -fsaklar akan menghancurkan file Anda yang ada (target tautan)? Dalam kedua kasus, kami memiliki -iparameter (yang akan meminta pengguna untuk menimpa) juga, jika Anda ingin sedikit keamanan.
palswim
2
@palswim Posting SO ini menyiratkan aman karena -fhanya memanggil unlink()dan di link()bawah kap: stackoverflow.com/a/1466570/157385 . Saya berharap saya hanya ingat urutan yang benar!
Mike Branski
4
Tidak bekerja. Kebutuhan -n. Lihat jawaban yang diterima.
Shawn Welch
119

Ok, saya menemukan di mana kesalahan saya: orang tidak boleh meletakkan yang pertama /di jalur

Dengan kata lain, perintah dalam pertanyaan saya harus:

Creation -> ln -s {path/to/file-name} {link-name}
Update -> ln -sfn {path/to/file-name} {link-name}

dari pada

Creation -> ln -s {/path/to/file-name} {link-name}
Update -> ln -sfn {/path/to/file-name} {link-name}

mempertimbangkan kasus saya.

Jérôme Verstrynge
sumber
22
Untuk beberapa informasi tambahan tentang mengapa demikian, perbedaannya adalah satu adalah relativejalan (tanpa awalan /) dan yang lainnya adalah absolutejalan (dengan awalan /). Jika Anda mengelola sistem Linux, Anda memahami perbedaannya. Misalnya perbedaan antara rm -rf ./*dan rm -rf /.*memutuskan apakah Anda mempertahankan pekerjaan Anda atau tidak :)
Safado
5
Ini tidak menjawab pertanyaan 'bagaimana memperbarui / mengesampingkan tautan sym'
Sirch
Baris ln -sfn {path / to / file-name} {link-name}.
Jérôme Verstrynge
6
-n (--no-dereference) membuatnya memperlakukan {nama tautan} seperti file normal daripada mengikuti tautan. Mengingat bahwa Anda perlu beroperasi pada tautan yang tidak mengikutinya, Anda harus menggunakan opsi ini.
feldoh
1
Jawaban ini harus menjadi jawaban sorotan dengan -nparameter untuk mengganti tautan simbol.
Nick Tsai
12

Masalah pertama:

Mengutip Anda:

Kreasi dan penghapusan berfungsi dengan baik. Tetapi pembaruan tidak berfungsi. Setelah melakukan perintah ini, symlink menjadi tidak valid.

Masalah dengan struktur direktori yang diberikan:

~ / skrip / test / ~ / skrip / test / remote_loc / ~ / skrip / test / remote_loc / site1 / ~ / skrip / tes / remote_loc / site1 / stuff1.txt ~ / skrip / test / remote_loc / site2 / ~ / script /test/remote_loc/site2/stuff2.txt ~ / scripts / test / remote_loc / site2 / ~ / scripts / test / remote_loc / site3 / stuff3.txt

dan menggunakan perintah:

ln -s /remote_loc/site1 test_link

Apakah itu menciptakan tautan simbolis di $ PWD Anda, atau direktori kerja saat ini, yang menunjuk ke file yang tidak ada dari /, atau root, di / remote_loc / site1

Jika PWD Anda ada di ~ / skrip / maka Anda harus menggunakan ini:

ln -s remote_loc/site1 test_link

kalau tidak Anda bisa menggunakan path absolut penuh seperti:

ln -s /home/yourusername/remote_loc/site1 test_link

Masalah kedua:

Mengutip Anda:

Saya telah membaca di sana-sini bahwa tidak mungkin untuk memperbarui / mengganti symlink. Jadi ada informasi yang saling bertentangan di internet. Siapa yang benar? Jika symlink dapat diperbarui / diganti, bagaimana saya bisa mencapai ini?

Untuk menjawab pertanyaan Anda "Siapa yang benar", saya tidak yakin apa yang sebenarnya Anda baca, atau bagaimana itu dipahami. Tapi, yang berikut ini akan membantu menjernihkan:

  1. Apa yang bisa diperbarui, dan
  2. Apa yang tidak bisa diperbarui tanpa menggunakan switch yang sesuai.


Memperbarui tautan simbolis dengan target yang bukan direktori.

ln -sf:
The -f atau - memaksa menghapus file tujuan yang ada, Ini digunakan untuk memperbarui target atau tujuan tautan.

Contoh:

 ln -sf /tmp/test /tmp/test.link; ls -go /tmp |grep test
 -rw-r--r-- 1    0 Jun  8 17:19 test
 lrwxrwxrwx 1    9 Jun  8 17:27 test.link -> /tmp/test

Tapi, seperti yang Anda lihat, itu akan memberikan jalur absolut jika jalur absolut dalam lnargumen. Memberikan path lengkap diperlukan ketika direktori kerja saat ini berbeda dari direktori induk tautan.


Jalur Relatif:

ln -sfr:
-r atau --relative membuat tautan simbolik relatif terhadap lokasi tautan.

Contoh:

ln -sfr /tmp/test  /tmp/test.link  ; ls -go /tmp| grep test
-rw-r--r-- 1    0 Jun  8 17:19 test
lrwxrwxrwx 1    4 Jun  8 17:27 test.link -> test

Namun, memperbarui tautan ke direktori tidak akan berfungsi jika targetnya adalah direktori.

Contoh:

ln -sf /tmp/testdir  /tmp/testdir.link  ; ls -go /tmp  |grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1    7 Jun  8 17:47 testdir.link -> testdir

Seperti yang Anda lihat, meskipun menggunakan nama path absolut yang diberikan dalam lnargumen di atas tanpa opsi -r, tautan simbolik masih relatif terhadap tautan.


Perbarui Tautan ke Direktori:

ln -sfrn:
The -n atau --no-dereference memperlakukan LINK_NAME sebagai file normal jika itu adalah tautan simbolis ke direktori.

Contoh:

ln -sfn /tmp/testdir /tmp/testdir.link; ls -go /tmp| grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1   12 Jun  8 17:48 testdir.link -> /tmp/testdir

Berbeda dengan:

ln -sfnr /tmp/testdir /tmp/testdir.link; ls -go /tmp| grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1    7 Jun  8 17:48 testdir.link -> testdir
Keith Reynolds
sumber
6
$ touch test1 test2
$ ln -sf test2 test1
$ ls -l test[12]
lrwxrwxrwx 1 user01 user01 5 2012-05-17 14:41 test1 -> test2
-rw-r--r-- 1 user01 user01 0 2012-05-17 14:41 test2
jirib
sumber
Ketika saya melakukan tes dengan 1 level direktori, itu berfungsi, tetapi saya mencoba menggunakan direktori multi-level, dan itu tidak berfungsi. Saya telah memperbarui pertanyaan saya.
Jérôme Verstrynge