ฉันจะสร้างลิงก์สัญลักษณ์ที่สัมพันธ์กันใน Linux ได้อย่างไร


คำตอบ:


77
  1. ไปที่ไดเรกทอรีที่คุณต้องการให้ลิงค์อยู่
  2. เรียกใช้คำสั่ง ln -s ../some/other/file linkname

เส้นทางที่คุณระบุจะถูกเก็บไว้กับไฟล์ เมื่อคุณเข้าถึงไฟล์พา ธ ที่เก็บไว้จะถูกค้นหาและขยายสัมพันธ์กับไฟล์ ไม่ทราบว่าคุณอยู่ในไดเรกทอรีใดเมื่อคุณสร้างลิงค์


23
ไม่คุณทำไม่ได้ คุณต้องตรวจสอบให้แน่ใจว่าคุณระบุตำแหน่งที่สัมพันธ์กับชื่อลิงก์แทนไดเรกทอรีปัจจุบันของคุณ
Ignacio Vazquez-Abrams

5
เพื่อช่วยในการทำความเข้าใจ: เส้นทางที่คุณระบุจะถูกเก็บไว้ในไฟล์ เมื่อคุณเข้าถึงไฟล์พา ธ ที่เก็บไว้จะถูกค้นหาและขยายสัมพันธ์กับไฟล์ ไม่ทราบว่าคุณอยู่ในไดเรกทอรีใดเมื่อคุณสร้างลิงค์
แมเรียน

2
เทียบเท่าว่า:ln -s ../some/other/file /some/dir/linkname
sehe

1
แทนที่จะไปลงไดเรกทอรีและขึ้นอีกครั้งคุณสามารถทำได้ln -s ./file linknameตั้งแต่.อ้างถึงไดเรกทอรีปัจจุบัน
pduersteler

1
ln -s somedir/original-dir link-nameไม่สำเร็จ. มันสร้างไดเรกทอรีที่มีชื่อlink-nameที่มีลิงค์ที่ไม่ถูกต้อง คำสั่งที่ใช้งานได้คือln -sr somedir/original-dir link-name
Lorenz Meyer

28

เวอร์ชันล่าสุดของ GNU coreutils 'ln (> = 8.16) รองรับตัวเลือก--relative(หรือ-r) ซึ่งหมายความว่าคุณสามารถโทรln -sด้วย 2 พา ธ สัมบูรณ์หรือสัมพัทธ์ (ในส่วนที่เกี่ยวข้องกับไดเรกทอรีการทำงานของคุณ) และจะหาเส้นทางสัมพัทธ์ที่ถูกต้องซึ่งจะต้องเป็น เขียนถึง symlink


2
ขอบคุณ -rตัวเลือกที่จะเป็นประโยชน์เมื่อคุณข้ามรวบรวมและต้องการเส้นทางที่แน่นอนในการสร้างโฮสต์ แต่ทางญาติเป้าหมาย
Robert Calhoun

rdfind สามารถสร้าง symlink ที่แย่มาก ๆ ที่ไม่เพียง แต่สมบูรณ์ แต่ backtrack ออกจากไดเรกทอรีโดยไม่มีเหตุผล ln -r -s targetfile myaliasสามารถช่วยคุณแก้ไขได้
Ray Foss

2

สิ่งที่คุณต้องเข้าใจก็คือ symlink นั้นเป็นเหมือนไฟล์ข้อความมากกว่าเช่นรายการไดเรกทอรีที่มีไฟล์ ดังนั้นหากคุณ

echo ../poo >/file/name

จากนั้นค่อนข้างคล้ายกับ

ln -s ../poo /file/name

ระบบไม่สนใจว่า/file/../pooมีอยู่จริงหรือไม่มันเป็นเพียงส่วนหนึ่งของข้อความที่ใส่ลงใน symlink เมื่อมีบางสิ่งพยายามเปิด symlink นั่นคือเมื่อระบบพยายามแก้ไข

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


นี้จะทำร้ายโดยบางสายระบบ - ฉันรู้เช่น BSD ใช้ในการช่วยให้คุณสามารถ symlink ไฟล์ระบบโดยเฉพาะอย่างยิ่งที่จะ<มีการเปลี่ยนแปลงวิธีการจัดสรรหน่วยความจำระบบ แน่นอนว่าไม่มีไฟล์ที่มีชื่อ<อยู่ในไดเรกทอรีนั้นมันเป็นวิธีที่ประหยัดในการสร้างไฟล์ที่มีขนาดเล็กมากซึ่งมีคุณสมบัติที่น่าสนใจมากกว่าไฟล์ข้อความปกติบนแพลตฟอร์มนั้น ๆ
tripleee

ลิงค์นั้นตายไปแล้ว ลองman.openbsd.org/OpenBSD-5.3/man5/malloc.conf.5แต่ให้สังเกตด้วยว่าพฤติกรรมใน OpenBSD เวอร์ชันล่าสุดนั้นมีน้อยลง ... สีสันมากขึ้น
tripleee

0

ลิงก์สัมพัทธ์เป็นเรื่องยุ่งยากสำหรับฉันใน OS X เช่น

~/Dropbox/git/dave-bot $ ln -s ../codyhess/bin ~/bin
~/Dropbox/git/dave-bot $ ln -s ../codyhess/bin/ ~/bin

ทั้งสองใช้งานไม่ได้ (มีบางสิ่งสร้างขึ้น แต่ไม่ใช่ไดเรกทอรี) ฉันสร้างการเชื่อมโยงที่ต้องการโดยใช้เส้นทางที่แน่นอน

~/Dropbox/git/dave-bot $ ln -s ~/Dropbox/git/codyhess/bin/ ~/bin

มันเป็นทางออกที่ทำงานได้ดังนั้นไม่จำเป็นต้องแสดงความคิดเห็น นี่อาจเป็นคำตอบที่แยกจากกัน
slhck

1
ความพยายามครั้งแรกของคุณกับลิงก์สัมพัทธ์นั้นผิดปกติและนั่นเป็นสาเหตุที่มันไม่ทำงาน คุณเข้าใจผิดว่าลิงก์สัมพัทธ์ทำงานอย่างไร ไม่มีอะไรยุ่งยากโดยเฉพาะอย่างยิ่งเกี่ยวกับมัน (ไม่แม้ว่าคุณจะใช้ OS X) บางทีคุณอาจเข้าใจผิดโดยคำตอบอื่น ๆ ที่พูดถึงการสร้างไดเรกทอรีการทำงานของคุณเมื่อคุณสร้างลิงค์ นั่นเป็นเพียงเพื่อให้ง่ายต่อการทำลิงก์อย่างถูกต้องและไม่จำเป็น คุณไม่ได้กำหนดเส้นทางสัมพัทธ์เทียบกับ dir ปัจจุบันของคุณ แต่ไปยังไดเรกทอรีของลิงค์ นี่คือสิ่งที่คุณเป็นหลังจาก:ln -s Dropbox/git/codyhess/bin ~/bin
Timo

@slhck เช่นกันเมื่อมีคนถามถึงวิธีการสร้างลิงก์แบบสัมพัทธ์ในสิ่งที่โลกบอกว่าคุณสามารถทำลิงค์สัมบูรณ์ได้ซึ่งถือว่าเป็น มันไม่ได้ตอบคำถาม OPs โดยเฉพาะและด้วยเหตุนี้มันค่อนข้างตรงข้ามกับการแก้ปัญหามันไม่มีทางแก้ปัญหา นี่ไม่ควรเป็นความคิดเห็นหรือคำตอบมันควรเป็นคำถาม "ลิงก์สัมพัทธ์ทำงานอย่างไร (อธิบายเพื่อให้ผู้ใช้ mac เข้าใจได้)" ฉันหวังว่าผู้ใช้ mac รายนี้จะอธิบายได้ดีพอ :)
Timo

@TimoLehto บางทีคุณอาจต้องการที่จะแสดงความคิดเห็นกับผู้เขียนต้นฉบับ (Cody Hess) ฉันคัดลอกโพสต์เท่านั้น
slhck

@slhck ฉันแนะนำให้คุณเพราะคุณเห็นว่าวิธีการแก้ปัญหาเป็น "ทำงานได้" และความคิดเห็นของคุณทำให้ฉันคิดว่าคุณจะเป็นคนที่จะโน้มน้าวใจถ้าใครต้องการที่จะตั้งค่าสถานะคำตอบว่า "ไม่ใช่คำตอบ" (และได้รับ ยอมรับการตั้งค่าสถานะ)
Timo

0

ฉันแค่ต้องการอธิบายเพิ่มเติมเกี่ยวกับวิธีสร้าง symlink โดยใช้พา ธ สัมพัทธ์ (พร้อมตัวอย่างโดยละเอียด)

ดังที่ Ignacio Vazquez-Abrams พูดถึงในความคิดเห็นคุณต้องระบุตำแหน่งไฟล์ / โฟลเดอร์ที่สัมพันธ์กับตำแหน่งที่จะสร้าง symlink ไม่ใช่สัมพันธ์กับไดเรกทอรีปัจจุบันของคุณ

ตัวอย่าง

คุณกำลังอยู่ใน/usr/share/nginx/html/_src/learn คุณจะสร้างลิงก์สัญลักษณ์codingใน/usr/share/nginx/html

สร้าง symlink สัมพัทธ์ (ทฤษฎี):

sudo ln -s /path/to/source/file-or-folder/relative/from/symlink /path/to/symlink/relative/to/current/location

สร้าง symlink ที่เกี่ยวข้องจริง:

sudo ln -s ./_src/learn/coding ../../coding

ข้อมูลเพิ่มเติม (ตัวอย่างเดียวกัน)

current path:                                  /usr/share/nginx/html/_src/learn
symlink(to be) relative to current path:       ../../coding                 
symlink location (absolute):                   /usr/share/nginx/html/coding
folder/file relative to symlink location:      ./_src/learn/coding
folder/file absolute path:                     /usr/share/nginx/html/_src/learn/coding  
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.