एक रिश्तेदार pathname के लिए एक प्रतीकात्मक लिंक बनाओ


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?


लेकिन क्या समस्या है कि इसे वर्णित व्यवहार के साथ हल किया जाएगा?
फ़ोर्सफ़स्क

ठीक है, कहते हैं कि आप डाउनलोड के लिए एक संपीड़ित फ़ोल्डर प्रदान करते हैं, और कुछ फ़ोल्डर की फ़ाइलों को कैसे सिमिलिंक करना है, इस पर कॉपी-पेस्ट करने योग्य निर्देश देना चाहते हैं।
हम्फ्रे बोगार्ट

2
ln -s $(pwd)/bar.txt ~/या एक स्थापित स्क्रिप्ट शामिल हैं।
फोर्सफेक

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सिमलिंक के लक्ष्य के रूप में संग्रहीत है। यह कोई भी मनमाना स्ट्रिंग हो सकता है (केवल प्रतिबंधों के साथ जो इसे खाली नहीं किया जा सकता है और इसमें NUL वर्ण नहीं हो सकता है), लेकिन जिस समय सिम्लिंक का उपयोग और समाधान किया जा रहा है, उस स्ट्रिंग को सापेक्ष पथ के रूप में समझा जाता है सिम्लिंक के मूल निर्देशिका (जब यह साथ शुरू नहीं होता है /)।


2
अच्छी तरह से कहा गया। आपने इसका उत्तर दिया जबकि मैं अपना उत्तर लिख रहा था। :)
शादुर

मेरे पास बस थोड़ा अलग सवाल था - और यह पूरी तरह से इसका जवाब देता है। मैं जानना चाहता था कि होम डायरेक्टरी को सिम्लिंक में कैसे संदर्भित किया जाए तो यह तब काम करेगा जब मैंने इसे एक उपयोगकर्ता से दूसरे में स्थानांतरित कर दिया। मुझे यकीन नहीं था कि अगर कुछ ~काम करेगा।
जो

"उस स्ट्रिंग को सिम्लिंक की मूल निर्देशिका के सापेक्ष पथ के रूप में समझा जाता है" - यह सब कुछ समझाता है!
बजन कोमाजेक

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। हालांकि मैक का उपयोग करना।
ivkremer

1
@ivkremer ऐसा लगता है कि यह विकल्प coreutils> = 8.16 (स्रोत: superuser.com/a/837935/403979 ) के बाद से उपलब्ध है
DJCrashdummy

रिश्तेदार ध्वज का उपयोग करने से मुझे "प्रतीकात्मक लिंक के कई स्तरों" के मुद्दों को स्पष्ट करना प्रतीत हो रहा था।
विक्स

12

नहीं, माफ करिए। प्रतीकात्मक लिंक उस स्थान के सापेक्ष होते हैं जो लिंक में होता है, न कि आपके द्वारा लिंक बनाए जाने के स्थान पर। इस व्यवहार के कई अच्छे कारण हैं, जिनमें से अधिकांश में बढ़ते दूरस्थ फाइल सिस्टम शामिल हैं।


7

symlinksकई लिनक्स वितरणों में मौजूद एक सुविधाजनक छोटी उपयोगिता कहा जाता है (मूल रूप से मार्क लॉर्ड्स, जो अब जे। ब्रांट बकले द्वारा अनुरक्षित है)।

रिश्तेदार होने के लिए एक निर्देशिका में सभी पूर्ण प्रतीकात्मक लिंक बदलने के लिए:

symlinks -c /path/to/directory

दुर्भाग्य से एक लिंक को परिवर्तित करने का कोई विकल्प नहीं है, आपको इसे पहले अपनी निर्देशिका में ले जाना होगा।

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

धन्यवाद। पर उपलब्ध सिमलिंक GitHub । जे। ब्रांट बकले द्वारा बनाए रखा गया। v1.4.3
एवगेनी वीरशैगिन

3

तुम कोशिश कर सकते हो:

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

लेकिन, यह पूर्ण पथनाम के लिए एक प्रतीकात्मक लिंक बनाता है। आपके पाठ संबंधी प्रश्न में सापेक्ष पथनाम का उल्लेख है ...

आम तौर पर, एक रिश्तेदार पथनाम आप क्या चाहते हैं, और आपको क्या ln -sदेता है। मुझे लगता है कि तुम क्या चाहते हो:

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

1

जैसा कि सबसे आम गोले पथों का विस्तार करते हैं, एक रिश्तेदार सिमलिंक बनाने के लिए आपको "स्रोत पथ" को उद्धृत करना चाहिए।

इसके अलावा, -sपैरामीटर का मतलब है --symboliclnडिफ़ॉल्ट रूप से हार्ड लिंक बनाता है।

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

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

0

यदि आप निश्चित हैं कि आपके माउंट पॉइंट्स बदलने का कोई मौका नहीं है, तो आप इस तरह से बैश शेल में क्या हासिल करने की कोशिश कर रहे हैं:

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

यह मानता है कि प्रतीकात्मक लिंक बनाते समय आप लक्ष्य निर्देशिका में हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.