จะเขียนทับลิงค์สัญลักษณ์ของไดเรกทอรีได้อย่างไร?


15

มีสองไดเรกทอรีและfoo1foo2

ตอนแรกผมทำ symlink ln -s foo1 barไดเรกทอรีโดย หลังจากนั้นฉันต้องการเปลี่ยน symlink ฉันก็เลยพิมพ์ln -sf foo2 bar

แต่ยังคงมีการเชื่อมโยงกับbar foo1symlink ถูกสร้างขึ้นภายในของfoo2foo1

สิ่งที่ฉันควรจะพิมพ์เมื่อฉันต้องการที่จะเปลี่ยนfoo1โดยfoo2?

ฉันทดสอบในสามสภาพแวดล้อม

  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 (ไม่มีรุ่น)

คำตอบ:


18

วิธีที่เหมาะสมในการทำเช่นนี้คือการใช้-n, --no-dereferenceตัวเลือกเช่นนั้น

$ ln -snf foo2 bar

นี่เป็นสาเหตุlnให้ถือว่า symlink ที่มีอยู่เป็นไฟล์ มิฉะนั้นจะ dereferences barเพื่อfoo1, ลงมาfoo1และใช้เดิมTARGETชื่อเป็นLINK_NAMEและที่ว่าทำไมคุณท้ายด้วย symlink ที่จะfoo2ถูกสร้างขึ้นภายในfoo1ไดเรกทอรี manpage ที่lnระบุต่อไปนี้ ...

-n, - ไม่มีการอ้างถึง
       ถือว่า LINK_NAME เป็นไฟล์ปกติหากเป็นลิงก์สัญลักษณ์ไปยัง
       ไดเรกทอรี

ด้านล่างนี้คือเอาต์พุตเชลล์บนเดสก์ท็อป Arch Linux ที่มีเวอร์ชัน 8.21 lnโดยมีและไม่มี--no-dereferenceตัวเลือกฉันได้ผลลัพธ์เดียวกันกับที่คุณทำโดยไม่มี--no-dereferenceตัวเลือก แต่ใช้--no-dereferenceตัวเลือกที่ได้ผลตามที่คาดหวัง

$ 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

ขอบคุณสำหรับคำตอบ. หากเป็นปัญหาสิ่งแวดล้อมฉันจะเขียนสภาพแวดล้อมของฉัน คุณใช้ระบบปฏิบัติการใดอยู่ เอาท์พุทln --versionอะไร?
เตารีดและ

ฉันลองสิ่งนี้บน Fedora 18 VM กับเวอร์ชัน 8.17 ที่น่าสนใจคือฉันลองสิ่งนี้บนเดสก์ท็อป Arch Linux ของฉันกับเวอร์ชัน 8.21 และได้ผลลัพธ์เดียวกันกับที่คุณทำ ดูเหมือนว่ามีบางสิ่งในรุ่นที่เปลี่ยนแปลงไป โซลูชันที่ฉันโพสต์ทำงานได้ทั้งสองกรณี
Drew Chapin

FYI ผมพบว่าคำตอบนี้ในฟอรั่ม justlinux.com
Drew Chapin

ขอบคุณ druciferre! ฉันไม่เคยคิดว่าlnคำสั่งนั้นมักจะอัพเกรด
เตารีดและ

ฉันทดสอบใน osx ด้วย lnทำงานเหมือนกับอูบุนตูและเซ็นโตสพร้อมกับไดเรกทอรีเขียนทับและln -snfแก้ปัญหา แม้ว่าln -hจะต้องการตัวเลือกที่จะใช้ใน osx
เตารีดและ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.