मेरा प्रतीकात्मक लिंक काम क्यों नहीं करता है?


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 सहानुभूति का समर्थन नहीं करता है, लेकिन यदि आप FAT फाइल सिस्टम पर बनाने का प्रयास करते हैं, तो उसे एक त्रुटि देनी चाहिए।)
निकोल हैमिल्टन

@Nicole Hamilton - यह ext4 है (के अनुसार df -T) - क्या उपरोक्त परिणाम आपके लिए भी अजीब है?
orokusaki

@orokusaki अजीब नहीं है। नीचे मेरा जवाब देखें। बस एक सिर, उन्हें करने के लिए बिल्ली को छूने के लिए कोई ज़रूरत नहीं है। उन्हें यहां तक ​​मौजूद होने की जरूरत नहीं है। बस आपको कुछ टाइपिंग बचाने के लिए!
nerdwaller

जवाबों:


50

सीलिंक लिंक के लिए पूर्ण पथ या सापेक्ष पसंद करते हैं, अन्यथा वे अक्सर file-1.txtस्थानीय रूप से ( विषम रूप से पर्याप्त) की तलाश कर सकते हैं ।

नेविगेट करें properऔर निष्पादित करें ls -lऔर आप देख सकते हैं कि सिमिलिंक की तलाश है 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 *एक सिमिलिंक किए गए फ़ोल्डर में न जाएं - आप उस फ़ोल्डर को मिटा सकते हैं जिससे वह लिंक करता है। बस rm symlinkname करें। बस कुछ चीजों पर मैंने गलतियाँ की हैं: D
nerdwaller

3

समस्या सापेक्ष पथों का उपयोग है। यदि आप अपने लिंक निर्माण को पूर्ण स्पष्ट पथ के साथ निर्दिष्ट करते हैं, तो यह काम करता है।

$ ln -s ~ / वास्तविक / file1.txt ~ / वास्तविक / file2.txt ~ / उचित /

$ बिल्ली उचित / file1.txt

फ़ाइल 1

$

आपका उदाहरण आपके properवर्तमान माता-पिता दोनों के बजाय वर्तमान निर्देशिका के अंतर्गत वास्तविक नाम के एक उपनिर्देशिका के लिए लिंक बनाता है ।


1

प्रतीकात्मक संबंध मुश्किल हो सकते हैं। संक्षेप में, एक प्रतीकात्मक लिंक एक फाइल है जिसमें किसी अन्य फ़ाइल के लिए फ़ाइल नाम / pathname होता है (और जिसे विशेष उपचार के लिए चिह्नित किया जाता है)। यदि लिंक फ़ाइल में pathname ' /' से शुरू होता है , तो इसे एक पूर्ण पथनाम के रूप में माना जाता है, और चीजें काफी सीधी होती हैं। यदि यह स्लैश से शुरू नहीं होता है, तो इसे एक रिश्तेदार पथनाम के रूप में माना जाता है - उस निर्देशिका के सापेक्ष जहां लिंक स्थित है। (यह सत्य है कि नाम में स्लैश हैं या नहीं।) इसलिए, आपने proper/file–1.txt" actual/file–1.txt" लिंक के रूप में बनाया , और जब आपने इसे एक्सेस करने का प्रयास किया, तो सिस्टम ने एक्सेस करने का प्रयास किया proper/actual/file–1.txt। आपको कहना चाहिए था

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

वैसे, आपको touchआदेशों की आवश्यकता नहीं थी ।  echo "file 1" > actual/file–1.txtबनाने के लिए पर्याप्त है actual/file–1.txt


0

एक संबंधित मुद्दा, और यह कई लोगों के लिए स्पष्ट हो सकता है, लेकिन मुझे कुछ मिनटों के लिए रोक दिया गया है: यदि आप एक निर्देशिका के भीतर एक सिमिलिंक बना रहे हैं जो स्वयं सिम्लिंक है, या वर्तमान वर्किंग डाइरेक्टरी के पथ के भीतर एक सिमलिंक है, तो आप हो सकते हैं काम नहीं करने के लिए सहानुभूति के साथ समस्याओं के लिए भागो।

उपयोग करें cd ..और ls -lबार-बार, यह देखने के लिए कि क्या आपके माता-पिता निर्देशिका खुद सहमी हुई हैं।

यदि आपको cdमूल लक्ष्य निर्देशिका के लिए एक सिमलिंक बनाने की आवश्यकता है , और वहां नए सिमिलिंक बनाएं, तो सापेक्ष पथ सटीक हैं।

या इसे दूसरे तरीके से रखने के लिए: सापेक्ष पथ उत्पत्ति से लक्ष्य तक है। यदि मूल में बाद में सहानुभूति है, तो यह ठीक है। लेकिन आप एक निर्देशिका के भीतर एक नया उत्पत्ति link_name स्थापित करने में समस्याओं के लिए दौड़ सकते हैं जो कि किसी भी तरह से खुद को सममित है।


1
" cd ..और ls -lबार-बार" के बजाय , आप उपयोग कर सकते हैं namei -mox $PWD। एक और उपयोगी तरीका यह पता लगाने के लिए कि क्या पथ के साथ सीमलिंक हैं pwd -P, जिसका उपयोग करना है , जो आपको वर्तमान निर्देशिका के लिए एक पथ देता है, जिसमें कोई भी सहानुभूति नहीं होती है (इसलिए यदि pwdऔर pwd -Pअलग-अलग आउटपुट देते हैं, तो आप जानते हैं कि मार्ग के साथ कहीं सिमिलिंक है )।
अंसु 211

0

जब आप उस फ़ाइल का लिंक बनाने की कोशिश करते हैं जो मौजूद नहीं है (या आपने गलत तरीके से रास्ता दिया है) ln -s में कोई त्रुटि नहीं है। यह एक लिंक बनाता है लेकिन जब आप उस लिंक पर 'कैट' आज़माते हैं तो यह कहता है कि कोई फ़ाइल नहीं मिली। यहां तक ​​कि जब आप इसे 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

क्योंकि फ़ाइल आदि / 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"कभी-कभी" लक्ष्य के अस्तित्व के लिए जांच नहीं करता है, बस गलत है।
राल्फफ्राइडल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.