ทำไมลิงค์สัญลักษณ์ของฉันไม่ทำงาน


24

ฉันกำลังพยายามที่จะเข้าใจลิงก์สัญลักษณ์มากขึ้น ... และไม่มีโชคมาก นี่คือเอาต์พุตเชลล์จริงของฉันที่มีชื่อผู้ใช้ / โฮสต์เปลี่ยนแปลง:

username@host:~$ mkdir actual
username@host:~$ mkdir proper
username@host:~$ touch actual/file-1.txt
username@host:~$ echo "file 1" > actual/file-1.txt
username@host:~$ touch actual/file-2.txt
username@host:~$ echo "file 2" > actual/file-2.txt
username@host:~$ ln -s actual/file-1.txt actual/file-2.txt proper
username@host:~$ # Now, try to use the files through their links
username@host:~$ cat proper/file-1.txt
cat: proper/file-1.txt: No such file or directory
username@host:~$ cat proper/file-2.txt
cat: proper/file-2.txt: No such file or directory
username@host:~$ # Check that actual files do in fact exist
username@host:~$ cat actual/file-1.txt
file 1
username@host:~$ cat actual/file-2.txt
file 2
username@host:~$ # Remove the links and go home :(
username@host:~$ rm proper/file-1.txt
username@host:~$ rm proper/file-2.txt

ฉันคิดว่าลิงก์สัญลักษณ์ควรจะทำงานอย่างโปร่งใสในแง่ที่ว่าคุณสามารถทำงานกับไฟล์ที่ชี้ไปราวกับว่าคุณกำลังเข้าถึงไฟล์โดยตรง (ยกเว้นแน่นอนในกรณีrmที่แน่นอนว่าลิงก์ถูกลบออกไปอย่างง่ายดาย )


รูปแบบดิสก์ของคุณเป็นอย่างไร คุณใช้ระบบไฟล์อะไร (FAT ไม่สนับสนุน symlinks แต่ถ้าคุณพยายามที่จะทำบนระบบไฟล์ FAT ก็ควรให้ข้อผิดพลาด.)
นิโคลแฮมิลตัน

@NicoleHamilton - มัน ext4 (ตามdf -T) - เป็นผลข้างต้นที่แปลกสำหรับคุณเช่นกัน?
orokusaki

@orokusaki ไม่แปลกเลย ดูคำตอบของฉันด้านล่าง เพียงแค่หัวค่ำไม่จำเป็นต้องแตะไฟล์เพื่อแมว พวกเขาไม่จำเป็นต้องมีอยู่แม้กระทั่ง เพียงเพื่อช่วยให้คุณพิมพ์บางอย่าง!
nerdwaller

คำตอบ:


50

Symlinks มีแนวโน้มที่จะชอบเส้นทางแบบเต็มหรือสัมพันธ์กับการเชื่อมโยงมิฉะนั้นพวกเขามักจะมองหาfile-1.txtในท้องถิ่น (ผิดปกติพอ)

นำทางไปproperและดำเนินการls -lและคุณจะเห็นว่า symlink ที่กำลังมองหาเมื่อมันควรจะเป็นactual/file-1.txt../actual/file-1.txt

ดังนั้นคุณมีสองทางเลือก:

  1. ให้เส้นทางเต็ม

    ln -s ~/actual/file-1.txt ~/actual/file-2.txt ~/proper
  2. นำทางไปยังโฟลเดอร์ที่คุณต้องการให้ลิงค์อยู่และลิงค์จากที่นั่น

    cd proper
    ln -s ../actual/file-1.txt ../actual/file-2.txt ./

แก้ไข : คำแนะนำสำหรับการบันทึกการพิมพ์

คุณสามารถทำได้ ln -s ~/actual/file-{1,2}.txt ~/proper

รายการในวงเล็บปีกกาจะถูกแทนที่และวางไว้ซึ่งกันและกันสร้างคำสั่ง

ln -s ~/actual/file-1.txt ~/actual/file-2.txt ~/proper

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


2
ขอบคุณ - ฉันเพิ่งจะดึงผมออกมาก่อนที่จะอ่านคำตอบของคุณ
orokusaki

1
บางครั้งมันก็สับสนอย่างแน่นอน! ลินุกซ์มีแนวโน้มที่จะเป็นตัวอักษรดังนั้นถ้าคุณบอกว่าทำอะไร - มันจะ ระวังด้วยการเชื่อมโยงโฟลเดอร์ด้วยวิธีนี้ฉันได้เขียนทับหนึ่งหรือสองก่อน (เพียงระบุชื่อโดยไม่ต้องใช้เครื่องหมายทับ) นอกจากนี้อย่าrm -rf *ไปที่โฟลเดอร์ symlinked - คุณสามารถล้างโฟลเดอร์ที่ลิงก์ไป เพียงทำชื่อลิงก์ RM มีบางสิ่งที่ฉันทำผิดพลาดใน: D
nerdwaller

3

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

$ ln -s ~ / จริง / file1.txt ~ / จริง / file2.txt ~ / เหมาะสม /

$ cat ที่เหมาะสม / file1.txt

ไฟล์ 1

$

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


1

ลิงก์สัญลักษณ์อาจยุ่งยาก ในสาระสำคัญลิงก์สัญลักษณ์คือไฟล์ที่มีชื่อไฟล์ / ชื่อพา ธ สำหรับไฟล์อื่น (และถูกตั้งค่าสถานะเพื่อการดูแลเป็นพิเศษ) หากชื่อพา ธ ในไฟล์ลิงก์เริ่มต้นด้วย ' /' จะถือว่าเป็นชื่อพา ธ สัมบูรณ์และทุกสิ่งนั้นค่อนข้างตรงไปตรงมา หากไม่ได้เริ่มต้นด้วยเครื่องหมายสแลชจะถือว่าเป็นชื่อพา ธ สัมพัทธ์ - สัมพันธ์กับไดเรกทอรีที่มีลิงค์อยู่ (นี่เป็นความจริงหรือไม่ว่าชื่อมีทับ.) ดังนั้นคุณจะต้องสร้างproper/file–1.txtการเชื่อมโยงไป“ actual/file–1.txtproper/actual/file–1.txtและเมื่อคุณพยายามที่จะเข้าถึงระบบพยายามที่จะเข้าถึง คุณควรจะพูดว่า

ln s  ../actual/file1.txt  ../actual/file2.txt  proper

อย่างไรก็ตามคุณไม่ต้องการtouchคำสั่ง  จะเพียงพอที่จะสร้างecho "file 1" > actual/file–1.txtactual/file–1.txt


0

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

ใช้cd ..และls -lซ้ำ ๆ เพื่อดูว่าไดเรกทอรีผู้ปกครองของคุณเป็นตัว symlinked

หากคุณต้องการสร้าง symlink cdไปยังไดเรกทอรีเป้าหมายต้นฉบับและสร้างsymlink ใหม่ที่นั่นดังนั้นเส้นทางสัมพัทธ์จึงแม่นยำ

หรือกล่าวอีกนัยหนึ่ง: เส้นทางสัมพัทธ์มาจากต้นทางไปยังเป้าหมาย หาก Origin มีการเชื่อมโยงในภายหลัง แต่คุณอาจพบปัญหาในการตั้งค่า Origin link_name ใหม่ภายในไดเรกทอรีที่เชื่อมโยงกัน


1
แทน " cd ..และls -lซ้ำแล้วซ้ำอีก" namei -mox $PWDคุณสามารถใช้ อีกวิธีที่มีประโยชน์ในการค้นหาว่ามีการเชื่อมโยงตามเส้นทางคือการใช้pwd -Pหรือไม่ซึ่งจะให้เส้นทางไปยังไดเรกทอรีปัจจุบันซึ่งไม่มีการเชื่อมโยงใด ๆ (ดังนั้นหากpwdและpwd -Pให้ผลลัพธ์ที่แตกต่างกันคุณรู้ว่ามี symlink อยู่ระหว่างทาง )
Ansa211

0

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

ubuntu@ip-172-31-80-155:~/lab5$ ln -s etc/ufw/ufw.conf link1
ubuntu@ip-172-31-80-155:~/lab5$ ls -al
total 5360
drwxrwxr-x 2 ubuntu ubuntu    4096 Mar  9 18:56 .
drwxr-xr-x 7 ubuntu ubuntu    4096 Mar  9 18:42 ..
-rwxr--r-- 1 ubuntu ubuntu 5478400 Mar  9 18:32 backup.tar
lrwxrwxrwx 1 ubuntu ubuntu      16 Mar  9 18:56 link1 -> etc/ufw/ufw.conf
ubuntu@ip-172-31-80-155:~/lab5$ cat link1
cat: link1: No such file or directory

เนื่องจากไฟล์ etc / ufw / ufw.conf ไม่มีอยู่ เส้นทางที่ถูกต้องคือ /etc/ufw/ufw.conf

ubuntu@ip-172-31-80-155:~/lab5$ ln -s /etc/ufw/ufw.conf link2
ubuntu@ip-172-31-80-155:~/lab5$ ls -l
total 5352
-rwxr--r-- 1 ubuntu ubuntu 5478400 Mar  9 18:32 backup.tar
lrwxrwxrwx 1 ubuntu ubuntu      16 Mar  9 18:56 link1 -> etc/ufw/ufw.conf
lrwxrwxrwx 1 ubuntu ubuntu      17 Mar  9 19:00 link2 -> /etc/ufw/ufw.conf
ubuntu@ip-172-31-80-155:~/lab5$ cat link2
# /etc/ufw/ufw.conf
#

# Set to yes to start on boot. If setting this remotely, be sure to add a rule
# to allow your remote connection before starting ufw. Eg: 'ufw allow 22/tcp'
ENABLED=no

# Please use the 'ufw' command to set the loglevel. Eg: 'ufw logging medium'.
# See 'man ufw' for details.
LOGLEVEL=low

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