वर्तमान निर्देशिका को बदलने के बिना उपनिर्देशिकाओं में फ़ाइलों को सीलिंक करना


11

ऐसा लगता है कि उपनिर्देशिका को स्थानांतरित किए बिना एक फ़ाइल को एक नई फ़ाइल में एक नई फ़ाइल में सिंप्लिंक करना सरल होना चाहिए। लेकिन वाक्यविन्यास के बारे में कुछ हैरान करने वाला है और मैं उससे अपेक्षा करता हूं कि वह क्या करेगा। यहाँ एक परीक्षण मामला है:

mkdir temp
cd temp
mkdir deploy
echo "Contents of the build file!" > deploy/resources.build.php
ln -s deploy/resources.build.php deploy/resources.php
cat deploy/resources.php #bad symlink

यह सिर्फ एक टूटी हुई सिम्लिंक बनाता है! मैं इसे एक बिल्ड इनवायरमेंट सेटअप स्क्रिप्ट में चला रहा हूं, इसलिए मैं अगर संभव हो तो वर्तमान वर्किंग डायरेक्टरी को बदलने से बचना चाहता हूं।

ln -s deploy/resources.build.php resources.php
cat deploy/resources.php

यह भी काम नहीं करता है क्योंकि यह तैनात उपनिर्देशिका के बजाय अस्थायी निर्देशिका में सिमलिंक बनाता है।

cd deploy
ln -s resources.build.php resources.php
cd ..

यह काम करता है, लेकिन मैं यह जानना चाहता हूं कि निर्देशिकाओं को बदलने के बिना यह कैसे करना है।

पूर्ण पथ का उपयोग करना:

/home/whatever/src/project/temp/stuff/temp/deploy/resources.build.php

काम करता है, लेकिन अस्वाभाविक है और कुछ हद तक अव्यवहारिक है, विशेष रूप से एक बिल्ड वातावरण में जहां सभी प्रोजेक्ट सामान बिल्ड और इस तरह के बीच भिन्न हो सकते हैं।

मैं एक उपनिर्देशिका में दो फ़ाइलों के बीच एक सिम्लिंक कैसे बना सकता हूं, उस उपनिर्देशिका में और उसके बाहर जाने के बिना, और नई फ़ाइल "उपनाम" को एक नया नाम देते समय?

जवाबों:


10

लेकिन वाक्यविन्यास के बारे में कुछ हैरान करने वाला है और मैं उससे अपेक्षा करता हूं कि वह क्या करेगा।

जिस lnरूप में आप इसका उपयोग कर रहे हैं, उसके लिए तर्क इस प्रकार हैं:

ln [विकल्प] ... [-T] TARGET LINK_NAME (प्रथम फ़ॉर्म)

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

$ echo foo >foo
$ ln -s foo bar1
$ ln -s $PWD/foo bar2
$ cat bar1
foo
$ cat bar2
foo
$ ls -l bar1 bar2
lrwxrwxrwx 1 matt matt  3 Dec 29 16:29 bar1 -> foo
lrwxrwxrwx 1 matt matt 29 Dec 29 16:29 bar2 -> /home/matt/testdir/foo

उस उदाहरण में मैं "बार 1" और "बार 2" नाम से 2 सिर्लिंक बनाता हूं, जो एक ही फाइल की ओर इशारा करता है। lsयह दर्शाता है कि सहानुभूति खुद में अलग-अलग सामग्री है, हालांकि - एक में एक पूर्ण पथ होता है, और एक में एक रिश्तेदार पथ होता है। इस वजह से, कोई अन्य निर्देशिका में ले जाए जाने पर भी काम करना जारी रखेगा, और दूसरा नहीं करेगा:

$ mv bar2 /tmp
$ cat /tmp/bar2
foo
$ mv bar1 /tmp
$ cat /tmp/bar1
cat: /tmp/bar1: No such file or directory

इसलिए, यह देखते हुए कि हमें सापेक्ष और पूर्ण सहानुभूति दोनों बनाने में सक्षम होना चाहिए, और यहां तक ​​कि टूटी हुई सहालिंक बनाने के लिए जो लक्ष्य फ़ाइल को बाद में बनाए जाने पर अन-ब्रेक हो जाएगी, लक्ष्य तर्क को मुक्त पाठ के बजाय व्याख्या करना होगा। पहले से मौजूद फ़ाइल का पथ।

यदि आप परिनियोजन / resource.php नाम की फ़ाइल बनाना चाहते हैं, जो परिनियोजन / रिसोर्स.बिल्डिंग .php से लिंक करता है, तो आपको यह तय करने की आवश्यकता है कि क्या आप एक पूर्ण सिमिलिंक बनाना चाहते हैं (जो कि सिमिलिंक को स्थानांतरित करने के विरुद्ध लचीला है, लेकिन टूट जाता है यदि लक्ष्य को स्थानांतरित किया जाता है), या एक सापेक्ष सिम्लिंक (जो तब तक काम करता रहेगा जब तक कि सिम्कलिन और लक्ष्य दोनों एक साथ चले जाते हैं और समान सापेक्ष पथ बनाए रखते हैं)।

एक पूर्ण सिमिलिंक बनाने के लिए, आप यह कर सकते हैं:

$ ln -s $PWD/deploy/resources.build.php deploy/resources.php

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

$ ln -s resources.build.php deploy/resources.php

यदि वे एक ही निर्देशिका में नहीं थे, तो आपको इसके बजाय कुछ करने की आवश्यकता होगी:

$ ln -s ../foo/f bar/b

उस स्थिति में, भले ही fooऔर barआपकी वर्तमान निर्देशिका में दोनों हैं, आपको लक्ष्य../ में शामिल करने की ln आवश्यकता है क्योंकि यह वर्णन करता है कि fयुक्त निर्देशिका से कैसे खोजना है b

यह एक बहुत लंबी व्याख्या है, लेकिन उम्मीद है कि यह आपको lnवाक्यविन्यास को थोड़ा बेहतर समझने में मदद करता है।


3

आप लिंक को उप-प्रकार में बना सकते हैं, निम्नानुसार है:

  (cd deploy && ln -s resources.build.php resources.php && cat resources.php)

जब सबस्क्रिप्शन समाप्त हो जाता है, तो आप अपने आप को अभी भी सही निर्देशिका में पाएंगे।

वैकल्पिक रूप से, आप कोशिश कर सकते हैं

 ln -s resources.build.php deploy/resources.php

यह भी काम करता है, सीएल को इस तथ्य में शामिल करने की उपेक्षा करता है कि फ़ाइल resource.build.php उस निर्देशिका में नहीं है जहां आप कमांड जारी कर रहे हैं, लेकिन वास्तव में अंदर है ।/deploy


यह काला जादू है, साहब!
कज़कई

1

जब तक मुझे पता चला कि यह एक सहानुभूति है मूल रूप से एक कॉन्फिग फाइल है। यानी मैं उस पथ डेटा को एक साधारण पाठ फ़ाइल में कैसे लिखूंगा:

ln -s [target] [link name]

हो जाता है:

echo [target] > [link name]

त्रुटि है कि मैं (और शायद ओ पी) बना रही थी सोच में है ln जरूरतों फ़ाइल यह लक्षित कर रहा है के बारे में पता करने के लिए। ln परवाह नहीं है। यह सिर्फ एक फ़ाइल में कुछ पथ जानकारी लिख रहा है। यह एक पूरी तरह से उचित ln कमांड है:

ln -s /path/doesnt/exist/file.err
ll
file.err -> /path/doesnt/exist/file.err

इसलिये:

ln -s deploy/resources.build.php deploy/resources.php

एक simlink बुलाया फ़ाइल का उत्पादन resources.phpमें ./deployफ़ोल्डर फ़ाइल संदर्भित कर रहा है resources.build.phpफ़ोल्डर में ./deploy/deploy/

यह संभव नहीं है कि आप क्या चाहते हैं और एक खराब (टूटा हुआ) लिंक देते हैं। लिंक के साथ कुछ भी गलत नहीं है, अगर आप उस फाइल को वहां रखते हैं तो लिंक काम करता है। हालाँकि, (जैसा कि दूसरों ने बताया) मैं और ओपी चाहते थे:

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