मैं सहानुभूति कैसे संपादित कर सकता हूं?


64

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

दूसरे शब्दों में: क्या मैं एक सिमलिंक संपादित कर सकता हूं? यदि नहीं, तो क्यों नहीं?


मैं समझता हूं कि सहानुभूति को बदलने के विभिन्न तरीके हैं (दो विकल्प वर्तमान में उत्तर अनुभाग में हैं), लेकिन यह स्पष्टीकरण दिलचस्प होगा कि क्यों सहानुभूति से निपटने के लिए प्रतिस्थापन ही एकमात्र तरीका प्रतीत होता है। जहां आप इंगित करते हैं, वहां आप क्यों नहीं बदल सकते?


आपकी समझ थोड़ी सीमित है; एकमात्र कारण इसे 'फ़ाइल' कहा जाता है क्योंकि इसके लिए कोई बेहतर शब्द नहीं है।
शादुर

5
शर्मनाक अत्याचार के विपरीत, जो कि विंडोज़ संस्करण है, पॉज़िक्स-शैली प्रतीकात्मक लिंक फाइल सिस्टम लेयर में / पर काम करते हैं। एक को संपादित करने का एकमात्र तरीका सीधे फाइलसिस्टम को संपादित करना होगा - और यह आमतौर पर इसके लायक नहीं है।
शादुर

@Slur .lnk फाइलें वास्तव में शुरू करने के लिए सिम्बलिंक नहीं हैं (और NTFS में विस्टा के बाद से उचित सिम्बलिंक हैं); वे कमांड निष्पादित करने के लिए शॉर्टकट पसंद करते हैं, चाहे वह किसी विशिष्ट फ़ोल्डर में बदल रहा हो या किसी विशिष्ट तर्क के साथ और एक निश्चित CWD के साथ एक कार्यक्रम शुरू कर रहा हो।
JAB

जवाबों:


36

यह देखते हुए कि -fबस एक मूक प्रतिस्थापन है, आप परमाणु प्रतिस्थापनmv -T कर सकते हैं (-T यह काम करता है भले ही /loc.../link एक निर्देशिका है) :

ln -s /location/to/link linkname
# ... 
ln -s /location/to/link2 newlink
mv -T newlink linkname

linkname पूरी प्रक्रिया के दौरान सुलभ है।


7
इससे आपको परमाणु प्रतिस्थापन प्राप्त होता है, हालाँकि आप अभी भी संपादन के बजाय एक प्रतिस्थापन कर रहे हैं (नए लिंक में नया इनोड संख्या है)।
Psusi

2
@psusi मैं पूरी तरह से सहमत हूं, यह कुछ परिदृश्यों में अन्य उत्तर की तुलना में सिर्फ तकनीकी रूप से थोड़ा बेहतर विकल्प है।
ओली

यदि आप लिंक को किसी अन्य गंतव्य पर पुनर्निर्देशित कर रहे हैं तो यह इनोड संख्या बदलना छोटे बदलाव की तरह लगता है।
एम्स

4
यह मान लिया गया linknameहै कि यह किसी निर्देशिका की सहानुभूति नहीं है। अगर इससे बचने के लिए GNU पर या फ्रीबीएसडी पर -Tविकल्प का उपयोग करें । ध्यान दें कि उस तरह लिंक की अनुमतियों को संरक्षित नहीं करता है (सिस्टम पर जहां वे महत्वपूर्ण हैं)। mv-hln -sf
स्टीफन चेज़ेलस

निर्देशिका के लिए परिवर्तन सहिष्णुता के लिए एक अन्य समाधान -nविकल्पों का उपयोग करना है ln -sfn DESTINATION_DIRECTORY LINK_NAME:। पर और अधिक पढ़ें askubuntu.com/a/186227/69004
sobi3ch

22

यदि संपादित करके, आप इसका मतलब उस फ़ाइल को बदलना चाहते हैं, तो आप कर सकते हैं:

$ ln -s .bashrc test
$ ls -al test
lrwxrwxrwx 1 pascal pascal 7 2009-09-23 17:12 test -> .bashrc
$ ln -s .profile test
ln: creating symbolic link `test': File exists
$ ln -s -f .profile test
$ ls -al test
lrwxrwxrwx 1 pascal pascal 8 2009-09-23 17:12 test -> .profile

-fपैरामीटर ( --force) जब ln यह कारण बनता है कॉल करने के लिए करने के लिए पारित कर दिया unlink()सही से पहले सिस्टम कॉलsymlink()

निम्नलिखित स्टैक ओवरफ्लो उत्तर से लिया गया ।


9
मुझे लगता है कि यह संदिग्ध है अगर इसे "संपादित करें" के रूप में माना जा सकता है, क्योंकि अनलिंक (); सिमलिंक (); परमाणु नहीं है, इसलिए समय की एक छोटी मात्रा है जिसके दौरान लिंक मौजूद नहीं है।
फिर से खेलना

@ mauro.stettler हाँ, आप सही हैं। लेकिन मुझे लगता है कि यह आपके दृष्टिकोण पर निर्भर करता है। यदि आप केवल अंतिम परिणाम को ध्यान में रखते हैं, तो शायद आप इसे संपादित के रूप में मान सकते हैं, किसी अन्य चीज पर विचार नहीं किया जाएगा।
NlightNFotis

1
यूनिक्स टाइम शेयरिंग सिस्टम पेपर से उद्धृत खंड कठिन लिंक का वर्णन करता है। ये ओपी के बारे में पूछे गए सांकेतिक लिंक (सिमिलिंक) से पूरी तरह अलग हैं।
अंसार एसेट्टरमैन

4
ध्यान दें कि यह मान लिया गया testहै कि कोई निर्देशिका नहीं है। अन्यथा उस निर्देशिका में ln -s -f .profile testएक .profileसिमिलिंक पैदा करेगा । जीएनयू के lnपास इससे -Tबचने का एक विकल्प है।
स्टीफन चेज़लस

9

प्रतीकात्मक लिंक को परमाणु रूप से संशोधित करने की आवश्यकता है। यदि आप उन्हें लिखने के माध्यम से आधे रास्ते पर हैं, तो वे काम नहीं करेंगे। एक प्रतीकात्मक लिंक की सामग्री बहुत छोटी है (लिनक्स पर अधिकांश 4095 वर्णों पर: किसी फ़ाइल के लिए पथ की अधिकतम लंबाई), इसलिए कर्नेल स्तर पर एक प्रतीकात्मक लिंक के भाग को संपादित करने में बहुत कम बिंदु होंगे। इसलिए कर्नेल एक प्रतीकात्मक लिंक को संपादित करने के लिए किसी भी इंटरफ़ेस की पेशकश नहीं करता है, केवल एक नया बनाने के लिए एक इंटरफ़ेस, symlinkसिस्टम कॉल (प्लस unlinkकिसी भी फ़ाइल को निकालने के लिए सामान्य इंटरफ़ेस )।

symlinkसिस्टम कॉल केवल एक नया प्रतीकात्मक कड़ी बनाता है, यह किसी भी मौजूदा फ़ाइल को दूर नहीं करता। यह कष्टप्रद है, लेकिन फ़ाइलों को बनाने के लिए अन्य सिस्टम कॉल के साथ संगत है open( जैसे कि एक नई फ़ाइल बना सकते हैं या किसी मौजूदा फ़ाइल को काट सकते हैं, लेकिन किसी मौजूदा फ़ाइल को एक नई बनाई गई फ़ाइल से प्रतिस्थापित नहीं कर सकते हैं) और mkdir

शेल में, जैसा कि आपने खोजा है , जबकि आप प्रतीकात्मक लिंक को lnकमांड के साथ एटोमिकली बदल नहीं सकते हैं ( ln -sfपिछली फाइल को अनलिमिटेड लिंक बनाते हैं), आप इसे पहले एक अस्थायी नाम के तहत एक प्रतीकात्मक लिंक बनाकर कर सकते हैं और फिर इसे जगह में ले जाना।

tmp=$(TMPDIR=$(dirname -- "$link") mktemp)
ln -sf -- "$target" "$tmp"
mv -f "$tmp" "$link"

2
mv -f(पसंद ln -sf) वह नहीं करेंगे जो आप चाहते हैं अगर $linkएक निर्देशिका के लिए अंक। ग्नू ln और mv उसके -Tलिए है। mv(सिस्टम कॉल का नाम बदलने) होगा हमेशा के inode बदलने $linkजबकि ln -sfT(+ सिमलिंक का लिंक हटाने के) एक ही पुन: उपयोग कर सकते हैं।
स्टीफन चेजलस

0

तकनीकी रूप से, मौजूदा प्रतीकात्मक लिंक को संपादित करने के लिए कोई अंतर्निहित कमांड नहीं है। इसे कुछ ही कम कमांड के साथ आसानी से हासिल किया जा सकता है।

यहाँ थोड़ा बैश / zsh फ़ंक्शन है जो मैंने एक मौजूदा प्रतीकात्मक लिंक को अद्यतन करने के लिए लिखा था:

# -----------------------------------------
# Edit an existing symbolic link
#
# @1 = Name of symbolic link to edit
# @2 = Full destination path to update existing symlink with 
# -----------------------------------------
function edit-symlink () {
    if [ -z "$1" ]; then
        echo "Name of symbolic link you would like to edit:"
        read LINK
    else
        LINK="$1"
    fi
    LINKTMP="$LINK-tmp"
    if [ -z "$2" ]; then
        echo "Full destination path to update existing symlink with:"
        read DEST
    else
        DEST="$2"
    fi
    ln -s $DEST $LINKTMP
    rm $LINK
    mv $LINKTMP $LINK
    printf "Updated $LINK to point to new destination -> $DEST"
}

क्षमा करें, लेकिन आप "उत्तर" केवल पूछे गए प्रश्न से दूर से संबंधित हैं।
user2233709

हाय @ user2233709 - उपयोगकर्ता का प्रश्न " मैं सहानुभूति कैसे संपादित कर सकता हूं? " पहले वाक्य में और साथ ही समाधान प्रदान करके स्पष्ट रूप से उत्तर दिया गया था। क्या आप विस्तार से ध्यान देंगे?
ब्लिज़ड्रॉफ़ 77

2
क्या आपने वास्तव में प्रश्न पढ़ा है? यह इस बारे में है कि क्या सिम्बलिन को बदलना संभव है , बजाय इसे बदलने के । आपका प्रस्तावित "समाधान" एक स्क्रिप्ट है जो सिमलिंक की जगह लेती है।
22:22 बजे user2233709

0

मान लें कि लिंकनाम मौजूद है (पूर्व में) किए जाने के परिणामस्वरूप:

 ln -s   /the/path/to/a/file   linkname

फिर, सिमलिंक को बदलने के तीन तरीके हैं:

  • -fबल के साथ ln का प्रयोग करें और यहां तक ​​कि निर्देशिकाओं के लिए -n(इनोड का पुन: उपयोग किया जा सकता है):

    ln -sfn /some/new/path linkname
    
  • सीलिंक निकालें और एक नया बनाएं (यहां तक ​​कि निर्देशिका के लिए):

    rm linkname; ln -s /some/new/path linkname
    
  • एक नया सिमिलिंक बनाएं, फिर mvयह (निर्देशिकाओं के लिए भी परमाणु परिवर्तन):

    ln -s  /some/new/path newlinkname
    mv -fT newlinkname linkname             # linkname remains after the command
    
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.