सिम्लिंक को ओवरराइड / अपडेट कैसे करें?


187

मैं प्रतीकात्मक लिंक का उपयोग करने की कोशिश कर रहा हूं। मैंने कुछ पठन किया और निम्नलिखित आदेश पाए:

Creation -> ln -s {/path/to/file-name} {link-name}
Update -> ln -sfn {/path/to/file-name} {link-name}
Deletion -> rm {link-name}

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

मैंने यहाँ और वहाँ पढ़ा है कि सिम्लिंक को अपडेट / ओवरराइड करना संभव नहीं है। तो नेट पर विरोधाभासी जानकारी है। कौन सही है? यदि एक सिमलिंक को अद्यतन / ओवरराइड किया जा सकता है, तो मैं इसे कैसे प्राप्त कर सकता हूं?

अपडेट करें

यहाँ मेरी निर्देशिका संरचना है:

~/scripts/test/
~/scripts/test/remote_loc/
~/scripts/test/remote_loc/site1/
~/scripts/test/remote_loc/site1/stuff1.txt
~/scripts/test/remote_loc/site2/
~/scripts/test/remote_loc/site2/stuff2.txt
~/scripts/test/remote_loc/site2/
~/scripts/test/remote_loc/site3/stuff3.txt

से ~/scripts/test/, जब मैं प्रदर्शन करता हूं:

ln -s /remote_loc/site1 test_link

एक test_linkबनाया है, और मैं ls -lयह कर सकता हूँ, लेकिन यह टूटा हुआ लगता है (मेरे सवाल के ऊपर मैंने जो कहा उसके विपरीत)।

मैं एक से अधिक निर्देशिका स्तर लिंक कैसे कर सकता हूं?


1
मैं unlinkइसके बजाय उपयोग करने की सलाह देता हूं rm। आपके साथ unlinkकभी भी गलती से स्विच का उपयोग करके स्रोत निर्देशिका में किसी भी फाइल को खोने का जोखिम नहीं है।
जेपी


@jpsy अनलिंक के बारे में आपकी सलाह बहुत अच्छी होगी, अगर यह सच था । स्पर्श zzzz की कोशिश करो; अनलंकृत ज़ज़्ज़। (कॉल को अनलिंक करें, rm के समान अनलिंक करें, लेकिन बिना फैंसी विकल्प, और कोई पुनरावृत्ति के)।
बजे ctrl-alt-delor

का उपयोग क्यों -n? (समस्या हो सकती है)। इसके अलावा अपने ln यदि का समर्थन करता है -tतो इसका इस्तेमाल, इन मामलों के लिए, और -Tया destination/अन्य मामलों के लिए।
ctrl-alt-delor-

जवाबों:


150

के -fसाथ प्रयोग करने lnसे किसी भी लिंक को पहले से ही अधिलेखित कर दिया जाएगा, इसलिए जब तक आपके पास सही अनुमति है, तब तक काम करना चाहिए ... यह हमेशा मेरे लिए काम किया है। आप कौन से ऑपरेटिंग सिस्टम का उपयोग कर रहे हैं?


मैंने अपने मुद्दे पर अधिक जानकारी के साथ अपने प्रश्न को अपडेट किया है।
जेरोमे वर्स्ट्रीनेज

मैं लिनक्स के अधीन हूं।
जेरोमे वर्स्ट्रीनेज

2
यदि आप lnपैरामीटर स्विच करते हैं, जैसा कि मैं करने के लिए प्रवण हूं, तो क्या -fस्विच आपकी मौजूदा फ़ाइलों (लिंक लक्ष्य) को नष्ट कर देगा? या तो मामले में, हमारे पास -iपैरामीटर है (जो उपयोगकर्ता को अधिलेखित करने के लिए संकेत देगा) साथ ही, यदि आप थोड़ी सुरक्षा चाहते हैं।
पालस्विम

2
@palswim इस SO पोस्ट का तात्पर्य है कि यह सुरक्षित है क्योंकि -fसिर्फ कॉल unlink()और link()हुड के नीचे: stackoverflow.com/a/1466570/157385 । मेरी इच्छा है कि मुझे सही आदेश याद होगा, हालाँकि!
माइक ब्रैंस्की

4
काम नहीं करता। की जरूरत है -n। स्वीकृत उत्तर देखें।
शॉन वेल्च

118

ठीक है, मैंने पाया कि मेरी त्रुटि कहां है: किसी को पहले /रास्ते में नहीं डालना चाहिए ।

दूसरे शब्दों में, मेरे प्रश्नों में कमांड होनी चाहिए:

Creation -> ln -s {path/to/file-name} {link-name}
Update -> ln -sfn {path/to/file-name} {link-name}

के बजाय

Creation -> ln -s {/path/to/file-name} {link-name}
Update -> ln -sfn {/path/to/file-name} {link-name}

मेरे मामले पर विचार कर रहा है।


22
ऐसा क्यों है, इसके बारे में कुछ अतिरिक्त जानकारी के लिए, अंतर एक relativeपथ है (अग्रणी / के बिना) और दूसरा एक absoluteपथ है (अग्रणी / के साथ)। यदि आप एक लिनक्स सिस्टम का प्रबंधन कर रहे हैं तो यह महत्वपूर्ण है कि आप अंतरों को समझें। उदाहरण के लिए बीच का अंतर rm -rf ./*और यह rm -rf /.*तय करता है कि आप अपनी नौकरी रखते हैं या नहीं :)
Safado

5
यह इस सवाल का जवाब नहीं देता है कि 'एक लिंक को कैसे अपडेट /
ओवरडोज किया जाए

Ln -sfn {path / to / file-name} {link-name} लाइन करता है।
जेरोमे वर्स्ट्रीज

6
-n (--no-dereference) इसे लिंक का अनुसरण करने के बजाय एक सामान्य फ़ाइल की तरह {लिंक नाम} का इलाज करता है। यह देखते हुए कि आपको उस लिंक पर काम करना है, इसका पालन न करें, आपको इस विकल्प का उपयोग करना चाहिए।
फेल्डोह

1
यह उत्तर -nप्रतीक लिंक को बदलने के लिए पैरामीटर के साथ हाइलाइट उत्तर होना चाहिए ।
निक

12

पहला मुद्दा:

आपको उद्धृत करते हुए:

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

दी गई निर्देशिका संरचना के साथ समस्या:

~ / स्क्रिप्ट / परीक्षण / ~ / स्क्रिप्ट / परीक्षण / रिमोट_लोक / ~ / स्क्रिप्ट / परीक्षण / रिमोट_लोक / साइट 1 / ~ / स्क्रिप्ट / परीक्षण / रिमोट_लोक / साइट 1 / सामान 1 / ~ /test/remote_loc/site2/stuff2.txt ~ / स्क्रिप्ट / परीक्षण / रिमोट_लोक / साइट 2 / ~ / स्क्रिप्ट / परीक्षण / रिमोट_लोक / साइट 3 / stuff3.txt

और कमांड का उपयोग कर:

ln -s /remote_loc/site1 test_link

क्या यह आपके $ PWD में एक प्रतीकात्मक लिंक बनाता है, या वर्तमान वर्किंग डायरेक्टरी, जो / /, या root_loc / site1 पर /, या गैर-मौजूदा फ़ाइल को इंगित करता है।

यदि आपका पीडब्ल्यूडी ~ / लिपियों में है / तो आपको इसका उपयोग करना चाहिए:

ln -s remote_loc/site1 test_link

अन्यथा आप पूर्ण निरपेक्ष पथ का उपयोग कर सकते हैं:

ln -s /home/yourusername/remote_loc/site1 test_link

दूसरा अंक:

आपको उद्धृत करते हुए:

मैंने यहाँ और वहाँ पढ़ा है कि सिम्लिंक को अपडेट / ओवरराइड करना संभव नहीं है। तो नेट पर विरोधाभासी जानकारी है। कौन सही है? यदि एक सिमलिंक को अद्यतन / ओवरराइड किया जा सकता है, तो मैं इसे कैसे प्राप्त कर सकता हूं?

आपके प्रश्न का उत्तर देने के लिए "कौन सही है", मुझे यकीन नहीं है कि आप वास्तव में क्या पढ़ते हैं, या यह कैसे समझा गया था। लेकिन, निम्नलिखित को स्पष्ट करने में मदद करनी चाहिए:

  1. क्या अद्यतन किया जा सकता है, और
  2. उपयुक्त स्विच का उपयोग किए बिना क्या अद्यतन नहीं किया जा सकता है।


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

ln -sf:
-f या --force मौजूदा गंतव्य फ़ाइलों को हटाते हैं, इसका उपयोग लिंक के लक्ष्य या गंतव्य को अद्यतन करने के लिए किया जाता है।

उदाहरण:

 ln -sf /tmp/test /tmp/test.link; ls -go /tmp |grep test
 -rw-r--r-- 1    0 Jun  8 17:19 test
 lrwxrwxrwx 1    9 Jun  8 17:27 test.link -> /tmp/test

लेकिन, जैसा कि आप देख सकते हैं, यह पूर्ण पथ देगा यदि पूर्ण पथ lnतर्क में हैं। वर्तमान वर्किंग डाइरेक्टरी लिंक के पैरेंट डाइरेक्टरी से अलग होने पर पूरा रास्ता देना आवश्यक है।


सापेक्ष पथ:

ln -sfr:
-r या --relative लिंक के स्थान के सापेक्ष प्रतीकात्मक लिंक बनाता है।

उदाहरण:

ln -sfr /tmp/test  /tmp/test.link  ; ls -go /tmp| grep test
-rw-r--r-- 1    0 Jun  8 17:19 test
lrwxrwxrwx 1    4 Jun  8 17:27 test.link -> test

लेकिन, यदि किसी निर्देशिका का लक्ष्य है, तो किसी निर्देशिका की लिंक को अपडेट करना काम नहीं करेगा।

उदाहरण:

ln -sf /tmp/testdir  /tmp/testdir.link  ; ls -go /tmp  |grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1    7 Jun  8 17:47 testdir.link -> testdir

जैसा कि आप देख सकते हैं, ln-r विकल्प के बिना उपरोक्त तर्क में दिए गए पूर्ण पथ नामों का उपयोग करने के बावजूद , प्रतीकात्मक लिंक अभी भी लिंक के सापेक्ष है।


निर्देशिकाओं के लिए लिंक अपडेट करें:

ln -sfrn:
-n या --no-dereference एक लिंक को एक सामान्य फ़ाइल के रूप में एक निर्देशिका के लिए एक प्रतीकात्मक लिंक होने पर LINK_NAME को मानता है।

उदाहरण:

ln -sfn /tmp/testdir /tmp/testdir.link; ls -go /tmp| grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1   12 Jun  8 17:48 testdir.link -> /tmp/testdir

इसके विपरीत:

ln -sfnr /tmp/testdir /tmp/testdir.link; ls -go /tmp| grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1    7 Jun  8 17:48 testdir.link -> testdir

6
$ touch test1 test2
$ ln -sf test2 test1
$ ls -l test[12]
lrwxrwxrwx 1 user01 user01 5 2012-05-17 14:41 test1 -> test2
-rw-r--r-- 1 user01 user01 0 2012-05-17 14:41 test2

जब मैं निर्देशिका के 1 स्तर के साथ परीक्षण करता हूं, तो यह काम करता है, लेकिन मैं बहु-स्तरीय निर्देशिकाओं का उपयोग करने की कोशिश कर रहा हूं, और यह काम नहीं करता है। मैंने अपना प्रश्न अपडेट कर दिया है।
जेरोमे वर्स्ट्राइनेज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.