วิธีอัพเดตเป้าหมายลิงก์สัญลักษณ์ (ln -f -s ไม่ทำงาน)


45

ฉันกำลังใช้

ln -f -s / var / www / html / release / build1390 แอปปัจจุบัน

เพื่ออัปเดตลิงก์สัญลักษณ์ "แอปปัจจุบัน" ด้วยปลายทางใหม่ อย่างไรก็ตามมันใช้งานไม่ได้ลิงค์ "แอปปัจจุบัน" ทำให้ปลายทางเดิมอยู่ แต่ฉันไม่ได้รับข้อผิดพลาดใด ๆ ...

ฉันไม่ต้องการลบลิงก์และสร้างใหม่เพียงแค่อัปเดตเป้าหมายของลิงก์ที่มีอยู่ เป็นไปได้ไหม

คำตอบ:


55

มันเหมาะกับฉันผลลัพธ์ของstrace ln -f -s /var/www/html/releases/build1390 app-currentอะไร

โอ้เนื่องจากเป็นไดเรกทอรีที่คุณต้องเพิ่มโดย-nไม่มีการอ้างอิงและสิ่งนี้ควรแก้ปัญหา -fมีความสะดวกสบายมากขึ้นเนื่องจากการเพิ่ม -f ทำให้ยกเลิกการเชื่อมโยงอย่างไรก็ตาม แม้ว่าฉันเดาว่ามันอาจจะเกิดขึ้นเร็วขึ้นสักสองสามร้อย ms บนระบบที่โหลดตามปกติ

ตัวอย่างเช่นถ้า arf ชี้ไปที่ / home แล้ว:

strace ด้วย-n:

strace ln -n -f -s / arf
...
symlink("/", "arf")           = -1 EEXIST (File exists)
unlink("arf")                           = 0
symlink("/", "arf")           = 0

strace โดย-n:

strace ln -f -s / arf
...
write(2, "ln: "..., 4ln: )                  = 4
write(2, "`arf/': cannot overwrite director"..., 34`arf/': cannot overwrite directory) = 34
write(2, "\n"..., 1)                    = 1

ดังนั้นโดยไม่ต้อง-nARF ได้รับ dereferenced ถือว่า LN จึงเป็น ARF /ราวกับว่ามันเป็นจริง ในตัวอย่างเฉพาะของคุณหากไม่มีข้อผิดพลาดฉันคิดว่าคุณอาจสร้างลิงก์สัญลักษณ์ใหม่ภายใน/var/www/html/releases/build1390 app-currentและต้องการล้างข้อมูลนั้น


4
ดีมัน -n ที่ทำมัน ขอบคุณมาก!
solsol

12

คุณสามารถใช้-nหรือ--no-dereferenceป้องกันไม่ให้เป้าหมายถูกยกเลิกการลงทะเบียนหากเป็น symlink นอกจากนี้คุณยังสามารถใช้-Tหรือ--no-target-directoryเพื่อให้มั่นใจว่าไฟล์เป้าหมายจะมักจะได้รับการปฏิบัติเป็นไฟล์ปกติ

สิ่งเหล่านี้ก่อให้เกิดพฤติกรรมที่แตกต่างกันเล็กน้อยดังตัวอย่างต่อไปนี้แสดงให้เห็น สมมติว่าsrcเป็นไฟล์บางไฟล์dirlinkเป็น symlink ไปยังไดเรกทอรีและdirเป็นไดเรกทอรีจริง

การใช้-n:

  • ln -sfn src dirlinkเขียนทับdirlinkและเชื่อมโยงไปยังsrc
  • ln -sfn src dir สร้างลิงค์ dir/src -> src

การใช้-T:

  • ln -sfT src dirlinkเขียนทับdirlinkและเชื่อมโยงไปยังsrc
  • ln -sfT src dir สร้างข้อผิดพลาด: ln: ‘dir’: cannot overwrite directory

1
มีคำตอบที่ถูกต้องและรัดกุมที่สุดสำหรับผู้ใช้ Linux
ross

มีวิธีใดที่จะบังคับให้เขียนทับไดเรกทอรีเป้าหมายดังนั้นคุณจะไม่ได้รับข้อความแสดงข้อผิดพลาดcannot overwrite directoryหรือไม่?
gitaarik

@rednaw คุณสามารถทำได้โดยการผูกคำสั่งสองสามคำ แต่lnตัวมันเองไม่ได้ลบไดเรกทอรี - มันอาจจะเป็นความคิดที่ไม่ดีเพราะมันจะต้องลบไฟล์จำนวนมากซ้ำ ๆ
augurar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.