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


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

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 यह, लेकिन ऐसा लगता है (मेरे प्रश्न में ऊपर जो कहा गया है उसके विपरीत)।

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


150
2018-05-17 12:39


मूल


मैं उपयोग करने की सलाह देते हैं unlink के बजाय rm। साथ में unlink गलती से गलत स्विच का उपयोग करके आप स्रोत निर्देशिका में किसी भी फाइल को खोने का जोखिम नहीं उठाते हैं। - Jpsy
आप अपने आदेश में अग्रणी / उपयोग कर रहे हैं - Jamie Cook
@jpsy अनलिंक के बारे में आपकी सलाह बहुत अच्छी होगी, अगर यह सच था। स्पर्श zzzz कोशिश करें; zzzz अनलिंक करें। (कॉल अनलिंक करें, आरएम के समान ही अनलिंक करें, लेकिन बिना फैंसी विकल्प के, और कोई रिकर्सन नहीं)। - ctrl-alt-delor
इसका उपयोग क्यों करें -n? (समस्या हो सकती है)। अगर आपका एलएन समर्थन करता है -t फिर इन मामलों के लिए, और इसका उपयोग करें -T या destination/ अन्य मामलों के लिए। - ctrl-alt-delor


जवाब:


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


124
2018-05-17 12:49



मैंने अपने मुद्दे पर अधिक जानकारी के साथ अपना प्रश्न अपडेट किया है। - Jérôme Verstrynge
मैं लिनक्स के नीचे हूँ। - Jérôme Verstrynge
यदि आप स्विच करते हैं ln पैरामीटर, जैसा कि मैं करने के लिए प्रवण हूँ, करेंगे -f स्विच अपनी मौजूदा फाइलों (लिंक लक्ष्य) को नष्ट कर दें? किसी भी मामले में, हमारे पास है -i पैरामीटर (जो उपयोगकर्ता को ओवरराइट करने के लिए संकेत देगा), अगर आप थोड़ी सी सुरक्षा चाहते हैं। - palswim
@palswim यह SO पोस्ट का तात्पर्य है कि यह सुरक्षित है क्योंकि -f बस कॉल unlink() तथा link() हुड के नीचे: stackoverflow.com/a/1466570/157385। मेरी इच्छा है कि मैं सही क्रम याद रखूंगा, यद्यपि! - Mike Branski
काम नहीं करता। ज़रूरत -n। स्वीकृत उत्तर देखें। - Shawn Welch


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

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

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}

मेरे मामले पर विचार


91
2018-05-17 13:32



क्यों कुछ है, इस बारे में कुछ अतिरिक्त जानकारी के लिए अंतर एक है relative पथ (अग्रणी / के बिना) और दूसरा एक है absolute पथ (अग्रणी / के साथ)। यदि आप एक लिनक्स सिस्टम का प्रबंधन कर रहे हैं तो यह गंभीर है कि आप मतभेदों को समझते हैं। उदाहरण के लिए अंतर rm -rf ./* तथा rm -rf /.* यह तय करता है कि आप अपना काम रखते हैं या नहीं :) - Safado
यह सवाल का जवाब नहीं देता है कि 'एक सिम लिंक को अपडेट / ओवरइड कैसे करें' - Sirch
Ln -sfn {path / to / file-name} {link-name} लाइन करता है। - Jérôme Verstrynge
क्या अंतर है -n विकल्प बनाओ? - dokaspar
-एन (--no-dereference) यह लिंक का पालन करने के बजाय {link name} को सामान्य फ़ाइल की तरह बनाता है। यह देखते हुए कि आपको उस लिंक पर काम करने की आवश्यकता है, इसका पालन न करें, आपको इस विकल्प का उपयोग करना होगा। - feldoh


पहला मुद्दा:

आपको उद्धृत करना:

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

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

~ / स्क्रिप्ट / परीक्षण / ~ / स्क्रिप्ट / परीक्षण / remote_loc /   ~ / लिपियों / परीक्षण / remote_loc / site1 /   ~ / लिपियों / परीक्षण / remote_loc / site1 / stuff1.txt   ~ / लिपियों / परीक्षण / remote_loc / site2 /   ~ / लिपियों / परीक्षण / remote_loc / site2 / stuff2.txt   ~ / लिपियों / परीक्षण / remote_loc / site2 /   ~ / लिपियों / परीक्षण / remote_loc / site3 / stuff3.txt

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

ln -s /remote_loc/site1 test_link

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

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

ln -s remote_loc/site1 test_link 

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

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

दूसरा मुद्दा:

आपको उद्धृत करना:

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

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

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


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

एलएन-एसएफ:
  -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तर्क एक पूर्ण पथ देना आवश्यक है जब वर्तमान कार्य निर्देशिका लिंक की मूल निर्देशिका से अलग है।


सापेक्ष पथ:

एलएन-एसआरएफ:
  -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

10
2018-06-08 22:58





$ 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

6
2018-05-17 12:42



जब मैं 1 स्तर की निर्देशिका के साथ परीक्षण करता हूं, यह काम करता है, लेकिन मैं बहु-स्तरीय निर्देशिकाओं का उपयोग करने की कोशिश कर रहा हूं, और यह काम नहीं करता है। मैंने अपना प्रश्न अपडेट किया है। - Jérôme Verstrynge