प्रतीकात्मक लिंक लक्ष्य कैसे अपडेट करें (ln -f -s काम नहीं कर रहा है)


45

मैं उपयोग कर रहा हूँ

ln -f -s / var / www / html / release / build1390 ऐप-करंट

एक नए गंतव्य के साथ प्रतीकात्मक लिंक "ऐप-करंट" अपडेट करने के लिए। हालांकि, यह काम नहीं करता है, लिंक "ऐप-करंट" इसे मूल गंतव्य रखता है, हालांकि, मुझे कोई त्रुटि नहीं मिलती ...

मैं लिंक को हटाना नहीं चाहता और इसे फिर से बनाऊंगा, बस किसी मौजूदा लिंक के लक्ष्य को अपडेट करूंगा। क्या यह संभव है?

जवाबों:


55

यह मेरे लिए काम करता है, का आउटपुट क्या है strace ln -f -s /var/www/html/releases/build1390 app-current?

ओह, चूंकि यह एक निर्देशिका है जिसे आपको -nबिना किसी रोक-टोक के जोड़ना होगा और इस मुद्दे को हल करना चाहिए। -fवास्तव में एक सुविधा के बाद से -f जोड़ने के लिए यह वैसे भी अनलिंक करने का कारण बनता है। हालांकि मुझे लगता है कि यह सामान्य रूप से भरी हुई प्रणाली पर कुछ सौ एमएस तेजी से होगा।

उदाहरण के लिए, यदि arf पहले से ही / घर को इंगित करता है:

स्ट्रेस विद -n:

strace ln -n -f -s / arf
...
symlink("/", "arf")           = -1 EEXIST (File exists)
unlink("arf")                           = 0
symlink("/", "arf")           = 0

बिना स्ट्रेस -n:

strace ln -f -s / arf
...
write(2, "ln: "..., 4ln: )                  = 4
write(2, "`arf/': cannot overwrite director"..., 34`arf/': cannot overwrite directory) = 34
write(2, "\n"..., 1)                    = 1

तो बिना -narf के dereferenced हो जाता है इसलिए ln इसे उतना ही सही मानते हैं जितना कि वास्तव में /। आपके विशेष उदाहरण में, अगर कोई त्रुटि नहीं है, तो मुझे लगता है कि आपने शायद अंदर एक नया प्रतीकात्मक लिंक बनाया है /var/www/html/releases/build1390 app-currentऔर इसे साफ करना चाहते हैं।


4
महान, यह एक है कि यह किया है। आपका बहुत बहुत धन्यवाद!
सॉलसोल

12

यदि आप एक सहिष्णुता है, तो आप लक्ष्य को निष्क्रिय होने से रोक सकते हैं -nया --no-dereferenceउसका उपयोग कर सकते हैं । तुम भी उपयोग कर सकते हैं -Tया --no-target-directoryयह सुनिश्चित करें कि लक्ष्य फ़ाइल जाएगा हमेशा एक नियमित रूप से फ़ाइल के रूप में व्यवहार किया जाना।

ये थोड़े अलग व्यवहार का उत्पादन करते हैं, जैसा कि निम्नलिखित उदाहरण से पता चलता है। मान लीजिए srcकि कुछ फ़ाइल है, dirlinkएक डायरेक्टरी के लिए एक सहानुभूति है, और dirएक वास्तविक निर्देशिका है।

का उपयोग कर -n:

  • ln -sfn src dirlinkओवरराइट करता है dirlinkऔर इसे लिंक करता हैsrc
  • ln -sfn src dir लिंक बनाता है dir/src -> src

का उपयोग कर -T:

  • ln -sfT src dirlinkओवरराइट करता है dirlinkऔर इसे लिंक करता हैsrc
  • ln -sfT src dir एक त्रुटि संदेश उत्पन्न करता है: ln: ‘dir’: cannot overwrite directory

1
लिनक्स उपयोगकर्ताओं के लिए सबसे सही और संक्षिप्त जवाब है।
रॉस

क्या लक्ष्य निर्देशिका को अधिलेखित करने के लिए कोई तरीका है जिससे आपको त्रुटि संदेश नहीं मिलेगा cannot overwrite directory?
गीताकार

@rednaw आप कुछ आदेशों का पालन करके ऐसा कर सकते हैं, लेकिन lnस्वयं निर्देशिकाओं को नहीं हटाते हैं - यह संभवतः एक बुरा विचार होगा, क्योंकि इसे संभवतः बड़ी संख्या में फ़ाइलों को हटाने की आवश्यकता होगी।
अगस्तुर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.