สร้างลิงก์สัญลักษณ์ไปยังชื่อพา ธ แบบสัมพันธ์


64

ฉันสามารถทำสิ่งนี้:

$ pwd
/home/beau
$ ln -s /home/beau/foo/bar.txt /home/beau/bar.txt
$ readlink -f bar.txt
/home/beau/foo/bar.txt

แต่ฉันต้องการทำสิ่งนี้:

$ pwd
/home/beau
$ cd foo
$ ln -s bar.txt /home/beau/bar.txt
$ readlink -f /home/beau/bar.txt
/home/beau/foo/bar.txt

เป็นไปได้ไหม ฉันสามารถแก้ไขชื่อพา ธ สัมพัทธ์และส่งต่อไปยังวิธีlnใด


แต่ปัญหาที่จะแก้ไขด้วยพฤติกรรมที่อธิบายไว้คืออะไร
forcefsck

สมมติว่าคุณมีโฟลเดอร์ที่บีบอัดไว้สำหรับการดาวน์โหลดและต้องการให้คำแนะนำในการคัดลอกวางในวิธีการเชื่อมโยงไฟล์บางส่วนของโฟลเดอร์
Humphrey Bogart

2
ln -s $(pwd)/bar.txt ~/หรือรวมถึงสคริปต์การติดตั้ง
forcefsck

2
ลิงก์จะจัดเก็บชื่อจริงที่คุณใช้บนบรรทัดคำสั่ง การแก้ไขชื่อนั้นกับไฟล์นั้นสัมพันธ์กับตำแหน่งลิงก์ คุณต้องใช้ln -s foo/bar.txt /home/beau/bar.txt
pqnet

คำตอบ:


62

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

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

คุณทำได้:

$ pwd
/home/beau
$ ln -s foo/bar.txt bar.txt
$ readlink -f /home/beau/bar.txt
/home/beau/foo/bar.txt

หรือสำหรับเรื่องที่:

$ cd foo
$ ln -s foo/bar.txt ../bar.txt

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


2
อย่างกล่าวว่า คุณตอบคำถามนี้ในขณะที่ฉันพิมพ์คำตอบของฉันเอง :)
Shadur

ฉันเพิ่งมีคำถามที่แตกต่างกันเล็กน้อย ฉันต้องการทราบวิธีการอ้างอิงโฮมไดเร็กตอรี่ใน symlink ดังนั้นมันจะทำงานเมื่อฉันถ่ายโอนจากผู้ใช้รายหนึ่งไปยังอีกคนหนึ่ง ฉันไม่แน่ใจว่าสิ่งที่ต้องการ~จะทำงาน
โจ

"สตริงนั้นเป็นที่เข้าใจกันว่าเป็นเส้นทางที่สัมพันธ์กับไดเรกทอรีแม่ของ symlink" - สิ่งนี้อธิบายทุกอย่าง!
Bojan Komazec

24

หากคุณใช้ coreutils ที่ใหม่กว่า (ฉันใช้ coreutils-8.22-11) ก็มีตัวเลือกให้ทำเช่นนี้:

ln --help | grep relative

สามารถเก็บข้อความโดยพลการ หากแก้ไขในภายหลังลิงก์ที่เกี่ยวข้องคือ -r, - สัมพันธ์สร้างลิงก์สัญลักษณ์ที่สัมพันธ์กับตำแหน่งลิงก์

ตัวอย่างเช่น:

$ mkdir /tmp/test
$ touch /tmp/test/to
$ ln -rs /tmp/test/to /tmp/test/from
$ ls -l /tmp/test/from
    lrwxrwxrwx 1 ptr ptr 4 aug   25 17.02 /tmp/test/to -> from

หืมมมดูเหมือนว่าจะไม่มีทางเลือกเช่น-rนั้น ใช้ Mac แม้ว่า
ivkremer

1
@ivkremer ดูเหมือนว่าตัวเลือกนี้จะมีให้ตั้งแต่coreutils> = 8.16 (ที่มา: superuser.com/a/837935/403979 )
DJCrashdummy

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

12

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


7

มียูทิลิตี้เล็ก ๆ น้อย ๆ ที่สะดวกสบายที่เรียกว่าsymlinks(แต่เดิมโดย Mark Lords ซึ่งขณะนี้ดูแลโดย J. Brandt Buckley) มีอยู่ใน Linux ดิสทริบิวชันหลายตัว

ในการแปลงลิงก์สัญลักษณ์ทั้งหมดในไดเรกทอรีให้สัมพันธ์:

symlinks -c /path/to/directory

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

mkdir ../tmp
mv link-to-relativize ../tmp
symlinks ../tmp
mv ../tmp/* .
rmdir ../tmp

ขอบคุณ symlinks ที่มีอยู่บนGitHub ปรับปรุงโดย J. Brandt Buckley v1.4.3
Evgeny Vereshchagin

3

คุณสามารถลอง:

ln -s `pwd`/bar.txt /home/beau/bar.txt

แต่มันสร้างลิงก์สัญลักษณ์ไปยังชื่อพา ธ สัมบูรณ์ คำถามที่เป็นข้อความของคุณถามถึงชื่อพา ธ ที่เกี่ยวข้อง ...

โดยปกติชื่อพา ธ สัมพัทธ์คือสิ่งที่คุณต้องการและสิ่งที่ln -sให้คุณ ฉันคิดว่าสิ่งที่คุณต้องการคือ:

cd /home/beau
ln -s foo/bar.txt bar.txt

1

เนื่องจากเชลล์ที่พบมากที่สุดจะขยายเส้นทางเพื่อสร้าง symlink แบบสัมพัทธ์คุณควรอ้างอิง "source path"

นอกจากนี้พารามิเตอร์หมายถึง-s สร้างฮาร์ดลิงก์ตามค่าเริ่มต้น--symbolicln

$ ln -s '../../relative_path' path
$ ls -al path

lrwxrwxrwx 1 empjustine empjustine 19 Aug  6 01:38 path -> ../../relative/path

0

หากคุณมั่นใจว่าไม่มีโอกาสที่จะเปลี่ยนจุดเมานท์คุณสามารถบรรลุสิ่งที่คุณพยายามทำในเปลือก bash เช่นนี้

ln -s `pwd`/bar.txt ~/bar.txt

สิ่งนี้จะถือว่าคุณอยู่ในไดเรกทอรีเป้าหมายเมื่อสร้างลิงก์สัญลักษณ์

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