สร้างลิงก์สัญลักษณ์ที่สัมพันธ์กับไดเรกทอรีปัจจุบัน


110

ฉันกำลังพยายามสร้างลิงก์สัญลักษณ์ในไดเรกทอรีบ้านของฉันซึ่งชี้ไปยังไดเรกทอรีบน HDD ภายนอกของฉัน

มันทำงานได้ดีเมื่อฉันระบุเช่นนี้:

cd ~
ln -s /run/media/name/exhdd/Data/ Data

อย่างไรก็ตามมันสร้างลิงค์ที่ผิดพลาดเมื่อฉันลองทำสิ่งนี้:

cd /run/media/name/exhdd
ln -s Data/ ~/Data

นี้จะสร้างการเชื่อมโยงที่ฉันไม่สามารถcdเข้าสู่

เมื่อฉันพยายามทุบตีบ่น:

bash: cd: Data: Too many levels of symbolic links

ลิงก์สัญลักษณ์ข้อมูลในบ้านของฉันยังเป็นสีแดงเมื่อlsตั้งค่าให้แสดงเอาต์พุตสี

ทำไมสิ่งนี้จึงเกิดขึ้น ฉันจะสร้างลิงค์ในลักษณะนั้นได้อย่างไร? (ฉันต้องการสร้าง symlink ไปยังไดเรกทอรีในไดเรกทอรีทำงานของฉันในไดเรกทอรีอื่น)


แก้ไข:ตามนี้คำตอบ StackOverflow ถ้าอาร์กิวเมนต์ที่สอง (ในกรณีของฉันที่ต้องการจะ ~ / ข้อมูล) อยู่แล้วและเป็นไดเรกทอรีที่lnจะสร้าง symlink เพื่อเป้าหมายภายในไดเรกทอรีที่

อย่างไรก็ตามฉันประสบปัญหาเดียวกันกับ:

ln -s Data/ ~/

7
เพียงแค่ปลายสุ่ม: มักจะเป็นเช่นเดียวกับcd ~ cd

3
ls -l ~/Dataจะช่วยให้คุณเห็นสิ่งผิดปกติกับลิงค์ "สีแดง"
msw

อืมไม่รู้ว่าฉันจะทำเช่นนั้นได้ขอบคุณ ฉันจำได้ว่าพยายามcatแต่ฉันลืมสิ่งที่เป็นผล ... (ฉันไม่ได้บ้านที่พวกเขาในขณะนี้.)
jcora

สังเกตด้านสมมติว่าคุณต้องการเพียง แต่สร้าง symlink ของไฟล์ทั้งหมดผบและ subdir ภายในโฟลเดอร์โดยเฉพาะอย่างยิ่งที่พูดทุกรายการภายใน/run/media/name/exhdd/Data/ไปDataแล้วใช้ต่อไปนี้ln -s /run/media/name/exhdd/Data/* Data
user2555595

คำตอบ:


115

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

$ pwd
/usr/bin
$ ln -s ls /usr/bin/ls2

สร้าง symlink ที่มีชื่อls2ใน/usr/binการls( ได้แก่ . /usr/bin/ls) เทียบกับไดเรกทอรีที่ symlink อยู่ใน ( /usr/bin) คำสั่งดังกล่าวจะสร้าง symlink การทำงานจากไดเรกทอรีใด ๆ

$ pwd
/home/me
$ ln -s ls /usr/bin/ls2

หากคุณย้าย symlink /usr/bin/lsไปยังไดเรกทอรีที่แตกต่างกันก็จะหยุดให้ชี้ไปยังไฟล์ที่

คุณกำลังทำ symlink ที่ชี้ไปยังและตั้งชื่อมันData Dataมันชี้ไปที่ตัวเอง คุณต้องสร้าง symlink ด้วยเส้นทางสัมบูรณ์ของไดเรกทอรี

ln -s "$(realpath Data)" ~/Data

14

ฉันมีปัญหาเดียวกัน Google นำไปสู่คำตอบนี้ แต่วิธีแก้ปัญหาที่ง่ายที่สุดไม่ได้จัดทำเป็นเอกสารไว้ที่นี่:

ln -sT 

-T ทำเคล็ดลับ

ผู้ชาย ln:

-T, --no-target-directory
    treat LINK_NAME as a normal file always

เพียงเพิ่มที่นี่เพื่อให้ทุกคนที่มีคำถามเดียวกันอาจพบสิ่งนี้ :)


9

lnพฤติกรรมของพา ธ ที่เกี่ยวข้องนั้นไม่ได้ใช้งานง่าย หากต้องการคืนสติให้ใช้-rธง

cd /run/media/name/exhdd
ln -sr Data/ ~/Data

คำอธิบาย:

   -r, --relative
          create symbolic links relative to link location

หมายความว่าอะไรที่lnจะทำในสิ่งที่คุณคาดหวัง มันจะคำนึงถึงสิ่งที่ไดเรกทอรีที่คุณอยู่ในสิ่งที่ไดเรกทอรีเป้าหมายอยู่และสร้างเส้นทางที่เกี่ยวข้องกับไดเรกทอรีการเชื่อมโยงจะมีพฤติกรรมเริ่มต้น (ไม่มี-r) คือการตีความพารามิเตอร์แรก (เป้าหมาย) อย่างแท้จริงใน ในกรณีใดคุณต้องสร้างเส้นทางด้วยตัวเองเพื่อให้ถูกต้องในไดเรกทอรีของลิงก์

หรือใช้เส้นทางแบบสัมบูรณ์ตามที่ระบุไว้โดย @SmithJohn

ln -s "$(realpath Data)" ~/Data #bash shell

หรือ

ln -s "(realpath Data)" ~/Data #fish shell

-1

ง่ายมากที่คุณสามารถสร้างลิงค์สำหรับโฟลเดอร์ ดูคำสั่งของฉัน

ln -s / home / Targatedfolder / var / www / html / link_name

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