सिमिलिंक को हार्ड लिंक में बदलें


25

मैं एक निर्देशिका में हार्ड लिंक के लिए नरम लिंक को पुनरावर्ती रूप से बदलना चाहूंगा। मैंने कुछ इस तरह की कोशिश की है:

for f in *; do (mv $f{,~} && ln $(readlink $f~) && rm $f~) done

... लेकिन इसकी दो प्रमुख समस्याएं हैं:

  • पुनरावर्ती नहीं
  • उन फ़ाइलों को उठाता है जो प्रतीकात्मक लिंक नहीं हैं

किसी भी तरह से उपरोक्त लाइन को खिलाना अच्छा होगा find -type l, लेकिन मुझे यकीन नहीं है कि यह कैसे करना है।


1
[यह चर्चा] [१] ( cp -aH) भी देखें । [१]: unix.stackexchange.com/questions/94185/…
माइकल शगोरिन

जवाबों:


34

यह आदेश काम करना चाहिए:

find -type l -exec bash -c 'ln -f "$(readlink -m "$0")" "$0"' {} \;

यह काम किस प्रकार करता है:

  • find -type l वर्तमान निर्देशिका में सभी लिंक पाता है।

  • -exec bash -c '...' {} \;आक्रमण करने के लिए मारपीट करता है ...

    यह गुजरता है {}- उस लिंक का नाम जिसे वर्तमान में संसाधित किया जा रहा है - एक तर्क के रूप में, जो बैश के रूप में एक्सेस कर सकता है $0

  • readlink -m "$0" प्रतीकात्मक लिंक के गंतव्य का पूर्ण पथ देता है।

  • ln -f "$(readlink -m "$0")" "$0"अधिलेखित ( -f) प्रतीकात्मक कड़ी $0अपने लक्ष्य के लिए एक कड़ी के साथ।

यदि लिंक किसी कारण से परिवर्तित नहीं किया जा सकता है, तो यह अछूता रहेगा और ln एक त्रुटि संदेश प्रिंट करेगा।


कि पिछले पैराग्राफ के बारे में, यह करने के लिए पूर्ण पथ निर्दिष्ट करने के लिए पर्याप्त नहीं हैं bashऔर ln?
डैनियल बेक

2
मेरी समस्या यह थी कि रीडलिंक डिफ़ॉल्ट रूप से एक सापेक्ष पथ देता है, लेकिन -eस्विच इसे ठीक करता है।
डेनिस

OSX के लिए कमांड क्या होगा?
इगोर मार्कोलोव

@IgorMarkelov मुझे खेद है, लेकिन OSX की बात आने पर मुझे इसका कोई सुराग नहीं है।
डेनिस

1
एक मैक पर यह है: brew install coreutilsऔर find * -type l -exec bash -c 'ln -f "$(greadlink -m "$0")" "$0"' {} \;
इगोर मार्केलोव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.