จะแทนที่ / อัพเดท symlink ได้อย่างไร?


188

ฉันกำลังพยายามใช้ลิงก์สัญลักษณ์ ฉันอ่านและพบคำสั่งต่อไปนี้:

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

การสร้างและการลบทำงานได้ดี แต่การปรับปรุงไม่ทำงาน หลังจากดำเนินการคำสั่งนี้ symlink จะไม่ถูกต้อง

ฉันได้อ่านที่นี่และมันเป็นไปไม่ได้ที่จะอัปเดต / แทนที่ลิงค์ ดังนั้นจึงมีข้อมูลที่ขัดแย้งกันในเน็ต ถูกต้องใคร หาก symlink สามารถอัปเดต / แทนที่ได้ฉันจะทำสิ่งนี้ได้อย่างไร

ปรับปรุง

นี่คือโครงสร้างไดเรกทอรีของฉัน:

~/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

จาก~/scripts/test/เมื่อฉันแสดง:

ln -s /remote_loc/site1 test_link

a test_linkถูกสร้างขึ้นและฉันสามารถทำได้ls -lแต่ดูเหมือนว่าจะเสีย (ตรงกันข้ามกับที่ฉันพูดไว้ในคำถามของฉัน)

ฉันจะทำการเชื่อมโยงหลายระดับไดเรกทอรีได้อย่างไร


1
ผมแนะนำให้ใช้แทนunlink rmด้วยunlinkคุณจะไม่มีความเสี่ยงที่จะสูญเสียไฟล์ใด ๆ ในไดเรกทอรีต้นทางโดยไม่ได้ตั้งใจโดยใช้สวิตช์ที่ผิด
Jpsy

คุณกำลังใช้ผู้นำ / ในคำสั่งของคุณ
เจมี่คุก

@jpsy คำแนะนำของคุณเกี่ยวกับการยกเลิกการเชื่อมโยงจะดีมากถ้ามันเป็นความจริง ลองแตะ zzzz ยกเลิกการเชื่อมโยง zzzz (ยกเลิกการเชื่อมโยงการโทรยกเลิกการเชื่อมโยงเหมือนกับ rm แต่ไม่มีตัวเลือกแฟนซีและไม่มีการเรียกซ้ำ)
ctrl-alt-delor

ทำไมใช้-n? (อาจเป็นปัญหา) นอกจากนี้หาก ln ของคุณรองรับให้-tใช้สำหรับกรณีเหล่านี้และ-Tหรือdestination/สำหรับกรณีอื่น ๆ
ctrl-alt-delor

คำตอบ:


150

การใช้-fด้วยlnจะเขียนทับลิงก์ที่มีอยู่แล้วตราบใดที่คุณมีสิทธิ์ที่ถูกต้องมันควรใช้งานได้ ... มันใช้ได้กับฉันเสมอ คุณใช้ระบบปฏิบัติการอะไร


ฉันได้อัปเดตคำถามของฉันพร้อมข้อมูลเพิ่มเติมเกี่ยวกับปัญหาของฉัน
Jérôme Verstrynge

ฉันอยู่ภายใต้ลินุกซ์
Jérôme Verstrynge

2
หากคุณสลับlnพารามิเตอร์ตามที่ฉันมักจะทำ-fสวิตช์จะทำลายไฟล์ที่มีอยู่ของคุณ (เป้าหมายลิงก์) หรือไม่ ไม่ว่าในกรณีใดเรามี-iพารามิเตอร์ (ซึ่งจะแจ้งให้ผู้ใช้เขียนทับ) เช่นกันหากคุณต้องการความปลอดภัยเล็กน้อย
palswim

2
@palswim นี้เพื่อโพสต์หมายถึงมันมีความปลอดภัยเพราะ-fเพียงแค่เรียกร้องunlink()และlink()ภายใต้ฝากระโปรง: stackoverflow.com/a/1466570/157385 ฉันหวังว่าฉันจะจำลำดับที่ถูกต้อง แต่!
Mike Branski

4
ไม่สำเร็จ. -nจำเป็น ดูคำตอบที่ยอมรับได้
Shawn Welch

119

ตกลงฉันพบข้อผิดพลาดของฉัน: ไม่ควรใส่ที่แรก/ในเส้นทาง

กล่าวอีกนัยหนึ่งคำสั่งในคำถามของฉันควรเป็น:

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

แทน

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

พิจารณากรณีของฉัน


22
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับสาเหตุที่เป็นข้อแตกต่างคือหนึ่งrelativeพา ธ (ไม่มีผู้นำ /) และอีกอันคือabsoluteพา ธ (ที่มีผู้นำ /) หากคุณดูแลระบบ Linux มันเป็นเรื่องสำคัญอย่างยิ่งที่คุณจะเข้าใจความแตกต่าง ยกตัวอย่างเช่นความแตกต่างระหว่างrm -rf ./*และrm -rf /.*ตัดสินใจว่าคุณเก็บงานของคุณหรือไม่ :)
Safado

5
นี่ไม่ได้ตอบคำถาม 'วิธีอัปเดต / แทนที่ลิงค์ sym'
Sirch

บรรทัด ln -sfn {path / to / file-name} {link-name} ทำ
Jérôme Verstrynge

6
-n (- ไม่ -dereference) ทำให้มันจัดการ {link name} เหมือนไฟล์ปกติแทนที่จะไปตามลิงค์ ระบุว่าคุณต้องใช้งานลิงค์ที่ไม่ได้ติดตามคุณต้องใช้ตัวเลือกนี้
feldoh

1
คำตอบนี้ควรเน้นคำตอบด้วย-nพารามิเตอร์สำหรับการแทนที่ลิงก์สัญลักษณ์
Nick Tsai

12

ประเด็นแรก:

อ้างถึงคุณ:

การสร้างและการลบทำงานได้ดี แต่การปรับปรุงไม่ทำงาน หลังจากดำเนินการคำสั่งนี้ symlink จะไม่ถูกต้อง

ปัญหากับโครงสร้างไดเรกทอรีที่กำหนด:

~ / สคริปต์ / ทดสอบ / ~ / สคริปต์ / ทดสอบ / remote_loc / ~ / สคริปต์ / ทดสอบ / remote_loc / ไซต์ 1 / ~ / สคริปต์ / ทดสอบ / remote_loc / ไซต์ 1 / stuff1.txt ~ / สคริปต์ / ทดสอบ / remote_loc / site2 / ~ / สคริปต์ /test/remote_loc/site2/stuff2.txt ~ / สคริปต์ / ทดสอบ / remote_loc / site2 / ~ / สคริปต์ / ทดสอบ / remote_loc / site3 / stuff3.txt

และใช้คำสั่ง:

ln -s /remote_loc/site1 test_link

มันคือการสร้างลิงค์สัญลักษณ์ใน $ PWD หรือไดเรกทอรีการทำงานของคุณซึ่งชี้ไปยังไฟล์ที่ไม่มีอยู่นอก / หรือรูทที่ / remote_loc / site1

หาก PWD ของคุณอยู่ใน ~ / สคริปต์ / คุณควรใช้สิ่งนี้:

ln -s remote_loc/site1 test_link

อื่นคุณสามารถใช้เส้นทางที่สมบูรณ์แบบเช่น:

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

ประเด็นที่สอง:

อ้างถึงคุณ:

ฉันได้อ่านที่นี่และมันเป็นไปไม่ได้ที่จะอัปเดต / แทนที่ลิงค์ ดังนั้นจึงมีข้อมูลที่ขัดแย้งกันในเน็ต ถูกต้องใคร หาก symlink สามารถอัปเดต / แทนที่ได้ฉันจะทำสิ่งนี้ได้อย่างไร

ในการตอบคำถามของคุณ "ใครถูกต้อง" ฉันไม่แน่ใจว่าคุณอ่านอะไรหรือเข้าใจแล้ว แต่สิ่งต่อไปนี้ควรช่วยให้ชัดเจนขึ้น:

  1. สิ่งที่สามารถอัปเดตและ
  2. สิ่งที่ไม่สามารถอัปเดตได้หากไม่ใช้สวิตช์ที่เหมาะสม


การอัพเดตลิงก์สัญลักษณ์กับเป้าหมายที่ไม่ใช่ไดเร็กทอรี

ln -sf:
-f หรือ - บังคับลบไฟล์ปลายทางที่มีอยู่ซึ่งใช้เพื่ออัปเดตเป้าหมายหรือปลายทางของลิงก์

ตัวอย่าง:

 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

แต่อย่างที่คุณเห็นมันจะให้เส้นทางที่แน่นอนหากเส้นทางที่แน่นอนอยู่ในlnข้อโต้แย้งของ การให้เส้นทางแบบเต็มจำเป็นสำหรับไดเรกทอรีการทำงานปัจจุบันแตกต่างจากไดเรกทอรีหลักของลิงก์


เส้นทางสัมพัทธ์:

ln -sfr:
-r หรือ - สัมพันธ์สร้างลิงก์สัญลักษณ์สัมพันธ์กับตำแหน่งของลิงก์

ตัวอย่าง:

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

แต่การอัปเดตลิงก์ไปยังไดเรกทอรีจะไม่ทำงานหากเป้าหมายคือไดเรกทอรี

ตัวอย่าง:

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

อย่างที่คุณเห็นแม้จะใช้ชื่อพา ธ สัมบูรณ์ที่ระบุในlnอาร์กิวเมนต์ของด้านบนโดยไม่มีตัวเลือก -r ลิงก์สัญลักษณ์ยังคงสัมพันธ์กับลิงก์


อัปเดตลิงค์ไปยังไดเรกทอรี:

ln -sfrn:
-n หรือ - no-dereference ถือว่า LINK_NAME เป็นไฟล์ปกติหากเป็นลิงก์สัญลักษณ์ไปยังไดเรกทอรี

ตัวอย่าง:

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

เมื่อเทียบกับ:

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

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

เมื่อฉันทำการทดสอบด้วยไดเรกทอรีระดับ 1 มันใช้งานได้ แต่ฉันพยายามใช้ไดเรกทอรีหลายระดับและไม่ได้ผล ฉันได้อัปเดตคำถามของฉันแล้ว
Jérôme Verstrynge
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.