Pertanyaan Bagaimana cara mengganti / memperbarui symlink?


Saya mencoba menggunakan tautan simbolik. Saya melakukan beberapa bacaan 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 sini dan di sana bahwa tidak mungkin untuk memperbarui / mengganti symlink. Jadi ada informasi yang kontradiktif di internet. Siapa yang benar? Jika symlink dapat diperbarui / diganti, bagaimana saya bisa mencapai ini?

Memperbarui

Berikut ini 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

Sebuah test_link dibuat, dan saya bisa ls -l itu, tetapi tampaknya rusak (bertentangan dengan apa yang saya katakan di atas dalam pertanyaan saya).

Bagaimana saya bisa melakukan tautan beberapa tingkat direktori?


150
2018-05-17 12:39




Saya merekomendasikan untuk menggunakannya unlink dari pada rm. Dengan unlink Anda tidak pernah mengambil risiko kehilangan file dalam direktori sumber dengan tidak sengaja menggunakan switch yang salah. - Jpsy
Anda menggunakan memimpin / di perintah Anda - Jamie Cook
@jpsy saran Anda tentang unlink akan sangat bagus, apakah itu benar. Coba sentuh zzzz; lepaskan tautan zzzz. (hapus tautan panggilan, batalkan tautan sama dengan rm, tetapi tanpa opsi mewah, dan tanpa rekursi). - ctrl-alt-delor
Mengapa menggunakan -n? (mungkin masalahnya). Juga jika ln Anda mendukung -t kemudian gunakan, untuk kasus-kasus ini, dan -T atau destination/ untuk kasus lain. - ctrl-alt-delor


Jawaban:


Menggunakan -f dengan ln akan menimpa tautan apa pun yang sudah ada di sana, jadi selama Anda memiliki izin yang benar, itu akan berfungsi ... Ini selalu berhasil untuk saya. Sistem operasi apa yang Anda gunakan?


124
2018-05-17 12:49



Saya telah memperbarui pertanyaan saya dengan lebih banyak informasi tentang masalah saya. - Jérôme Verstrynge
Saya di bawah linux. - Jérôme Verstrynge
Jika Anda mengganti ln parameter, karena saya cenderung melakukan, akankah itu -f beralih menghancurkan file Anda yang ada (target tautan)? Dalam kedua kasus, kami memiliki -i parameter (yang akan meminta pengguna untuk menimpa) juga, jika Anda ingin sedikit keamanan. - palswim
@palswim Posting SO ini menyiratkan aman karena -f telepon saja unlink() dan link() Dibawah tenda: stackoverflow.com/a/1466570/157385. Aku benar-benar berharap aku ingat urutan yang benar! - Mike Branski
Tidak bekerja. Kebutuhan -n. Lihat jawaban yang diterima. - Shawn Welch


Ok, saya menemukan di mana kesalahan saya: orang tidak boleh menempatkan yang pertama / di jalan.

Dengan kata lain, perintah dalam pertanyaan saya seharusnya:

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.


91
2018-05-17 13:32



Untuk beberapa informasi tambahan tentang mengapa demikian, perbedaannya adalah satu relative path (tanpa leading /) dan yang lainnya adalah an absolute path (dengan leading /). Jika Anda mengelola sistem Linux, itu KRITIS bahwa Anda memahami perbedaannya. Misalnya perbedaan antara rm -rf ./* dan rm -rf /.* memutuskan apakah Anda mempertahankan pekerjaan Anda atau tidak :) - Safado
Ini tidak menjawab pertanyaan 'cara memperbarui / melewati tautan sym' - Sirch
Jalur ln -sfn {path / to / file-name} {link-name} tidak. - Jérôme Verstrynge
Apa bedanya -n pilihan buat? - dokaspar
-n (--no-dereference) membuatnya memperlakukan {link name} seperti file biasa daripada mengikuti tautan. Karena Anda perlu mengoperasikan tautan yang tidak mengikutinya, Anda harus menggunakan opsi ini. - feldoh


Masalah pertama:

Mengutip Anda:

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

Masalahnya Dengan struktur direktori yang diberikan:

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

dan menggunakan perintah:

ln -s /remote_loc/site1 test_link

Apakah itu menciptakan tautan simbolik 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 seharusnya menggunakan ini:

ln -s remote_loc/site1 test_link 

lain Anda bisa menggunakan jalur absolut penuh seperti:

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

Masalah kedua:

Mengutip Anda:

Saya telah membaca di sini dan di sana bahwa tidak mungkin untuk memperbarui / mengganti   sebuah symlink. Jadi ada informasi yang kontradiktif di internet. siapa yang   kanan? Jika symlink dapat diperbarui / diganti, bagaimana saya bisa mencapai ini?

Untuk menjawab pertanyaan Anda "Siapa yang benar", saya tidak yakin apa tepatnya yang Anda baca, atau bagaimana itu dipahami. Namun, hal-hal berikut harus 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 --force 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 memberi jalan absolut jika jalur absolut masuk lnargumen. Memberikan jalur lengkap diperlukan ketika direktori kerja saat ini berbeda dari direktori induk tautan.


Jalan Relatif:

ln -sfr:
  The-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

Tapi, 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 lnArgumen di atas tanpa opsi-r, tautan simbolis 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

10
2018-06-08 22:58





$ 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

6
2018-05-17 12:42



Ketika saya melakukan tes dengan 1 level direktori, itu berhasil, tetapi saya mencoba menggunakan direktori multi-level, dan itu tidak bekerja. Saya telah memperbarui pertanyaan saya. - Jérôme Verstrynge