प्रतीकात्मक लिंक के कई स्तर


100

मैंने यह फ़ाइल संरचना बनाई:

test/src
test/firefox

जब मैं यह कमांड चलाता हूं:

ln -s test/src test/firefox

मैं यह test/firefox/srcइंगित करने के लिए एक प्रतीकात्मक लिंक बनाने की अपेक्षा करूँगा test/src, हालाँकि मुझे इसके बजाय यह त्रुटि मिली है:

-bash: cd: src: Too many levels of symbolic links
  • मैं क्या गलत कर रहा हूं?
  • क्या आप एक फ़ोल्डर के लिए एक प्रतीकात्मक लिंक नहीं बना सकते हैं जो उस फ़ोल्डर के सहोदर में संग्रहीत है?
  • इसका क्या मतलब है?

मुझे यकीन नहीं है कि मैंने आपका अनुसरण किया। कृपया ls -ld test test/*इन फ़ाइलों को बनाने के लिए आपके द्वारा चलाए गए आदेशों का आउटपुट या सटीक क्रम पोस्ट करें।
गिल्स

mkdir परीक्षण; mkdir test / src; mkdir परीक्षण / फ़ायरफ़ॉक्स; ln -s परीक्षण / src परीक्षण / फ़ायरफ़ॉक्स
डेविड Zorychta

इन आदेशों के साथ, cd test/firefox/srcत्रुटि दिखाई जाएगी cd: no such file or directory: test/firefox/src, क्योंकि test/firefox/srcएक झूलने वाला प्रतीकात्मक लिंक है। क्या आप cdकिसी अन्य प्रतीकात्मक लिंक पर चल रहे हैं src?
गिल्स

मुझे यकीन है कि आपने ln -sऔर हमारे बीच कुछ ऐसा किया है cdकि आप हमें बताएं नहीं। यह मानते हुए कि testआपकी वर्तमान निर्देशिका में केवल एक उपनिर्देशिका है, cd src(या आपने जो भी निष्पादित किया है) एक त्रुटि फेंकनी चाहिए। क्या आपने कुछ डाला test/firefox?
डब्यू

5
और जैसा @Gilles ने संकेत दिया, वह लिंक वह नहीं करेगा जो आप सोचते हैं कि यह करता है। रिश्तेदार लक्ष्यों के साथ प्रतीकात्मक लिंक हमेशा सिम्लिंक निर्देशिका के सापेक्ष होते हैं , उस निर्देशिका के नहीं जहां से आपने लिंक बनाया था। तो, एक निर्देशिका में होने के नाते /some/path, एक ln -s test/src test/firefoxसे , नहीं करने के /some/path/test/firefox/srcलिए इशारा करते हुए एक सिमलिंक पैदा करेगा । /some/path/test/firefox/test/src/some/path/test/src
डब्यू

जवाबों:


32

सतह पर, आपने जो सुझाव दिया है वह आपने मेरे लिए काम किया है।

उदाहरण

$ mkdir -p test/src test/firefox

$ tree --noreport -fp
.
`-- [drwxrwxr-x]  ./test
    |-- [drwxrwxr-x]  ./test/firefox
    `-- [drwxrwxr-x]  ./test/src

प्रतीकात्मक लिंक बनाएं:

$ ln -s test/src test/firefox

$ tree --noreport -fp
.
`-- [drwxrwxr-x]  ./test
    |-- [drwxrwxr-x]  ./test/firefox
    |   `-- [lrwxrwxrwx]  ./test/firefox/src -> test/src
    `-- [drwxrwxr-x]  ./test/src

इसे दूसरी बार चलाने पर आमतौर पर इसका उत्पादन होगा:

$ ln -s test/src test/firefox
ln: failed to create symbolic link ‘test/firefox/src’: File exists

तो आप यहाँ कुछ और होने की संभावना है। मुझे संदेह होगा कि आपके पास एक परिपत्र संदर्भ है जहां एक लिंक खुद को वापस इंगित कर रहा है।

आप इसे findथोड़ा बाहर निकालने के लिए उपयोग कर सकते हैं :

$ cd /suspected/directory
$ find -L ./ -mindepth 15

2
find -L ./ -mindepth 15अपराधी का पता चला
12:76 पर user7610

167

जैसा कि डब्बू एक टिप्पणी में बताते हैं, मुद्दा आपके रिश्तेदार रास्तों में है। मैं एक ऐसी ही समस्या से मेरी nginx विन्यास symlinking था /usr/local/etc/nginxकरने के लिए /etc/nginx। यदि आप इस तरह अपना सिमलिंक बनाते हैं:

cd /usr/local/etc
ln -s nginx/ /etc/nginx

आप वास्तव में लिंक / etc / nginx -> / etc / nginx करेंगे, क्योंकि स्रोत पथ लिंक के पथ के सापेक्ष है। निरपेक्ष रास्तों का उपयोग करते हुए समाधान उतना ही सरल है:

ln -s /usr/local/etc/nginx /etc/nginx

57
यह उत्तर अन्य की तुलना में स्पष्ट था। "निरपेक्ष रास्तों का उपयोग करें।"
वुल्फटोन

1
मैं पुष्टि कर सकता हूं कि यह मेरे लिए विंडोज पर काम कर रहा है cygwin। धन्यवाद!
16

मुझे अक्सर तर्क सही होने में समस्या होती है। OSX और GNU लिनक्स पर, वे उलट होते हैं जो मुझे और भी भ्रमित करते हैं।
डैनियल डब्ल्यू।

मुझे अभी भी इस काम पर विश्वास नहीं हो रहा है।
PNDA

5
आप सापेक्ष लिंक का उपयोग कर सकते हैं , लेकिन उन्हें उस निर्देशिका पर आधारित होना चाहिए जहां प्रतीकात्मक लिंक है । दूसरे शब्दों में: पहला तर्क वहीcd होना चाहिए जो आप तब लिखेंगे जब आप उस निर्देशिका से लक्षित निर्देशिका में जाना चाहेंगे जहाँ प्रतीकात्मक लिंक की फ़ाइल है।
तात्यामेली

9

साइमलिंक लिंक की मूल निर्देशिका के सापेक्ष हैं, lnप्रक्रिया की वर्तमान निर्देशिका के नहीं ।

जब तुम करोगे:

cd /top/dir
ln -s test/src test/firefox

(जहां test/firefoxएक निर्देशिका है), आप एक test/firefox/srcसिमलिंक बना रहे हैं जिसका लक्ष्य है test/src

यह निर्देशिका के test/srcसापेक्ष है test/firefox, इसलिए यह एक सहानुभूति है /top/dir/test/firefox/test/src

यदि आप चाहते थे कि सिमिलर एक कड़ी हो /top/dir/test/src, तो आपको लिखना होगा:

ln -s ../src test/firefox/

या

ln -s /top/dir/test/src test/firefox/

हालांकि यह आम तौर पर पूर्ण पथों के लिए सहानुभूति बनाने के लिए एक बुरा विचार है क्योंकि वे आसानी से टूट जाते हैं जब निर्देशिकाओं का नाम बदला जाता है या फाइल सिस्टम कहीं और माउंट किए जाते हैं।

GNU के साथ ln, आप इसके -rविकल्प का उपयोग करके इसे स्वयं गणना करने दे सकते हैं:

$ ln -rs test/src test/firefox/
$ ls -ld test/firefox/src
lrwxrwxrwx 1 chazelas chazelas 6 Nov 29 15:59 test/firefox/src -> ../src

5

सापेक्ष पथ के बजाय निरपेक्ष पथ का उपयोग करें, तो यह काम करेगा।

उदाहरण के लिए:

ln -s /home/user/test/src /home/user/test/firefox

0

इसका उत्तर निरपेक्ष मार्ग का उपयोग करना है। लेकिन वर्तमान निर्देशिका में किसी चीज़ के लिए पूर्ण पथ टाइप करना कष्टप्रद हो सकता है। उससे बचने के लिए आप pwd के कमांड प्रतिस्थापन का उपयोग कर सकते हैं। यदि आपका लक्ष्य वर्तमान निर्देशिका में है:

ln -s "$(pwd)"/target abs/path/to/link 

यदि आपका लिंक वर्तमान निर्देशिका में होना चाहिए:

ln -s /abs/path/to/target "$(pwd)"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.