प्रतीकात्मक लिंक श्रृंखलाओं को कैसे सूचीबद्ध करें?


36

इस उदाहरण को देखते हुए:

mkdir a
ln -s a b
ln -s b c
ln -s c d

यदि मैं निष्पादित करता हूं:

ls -l d

यह दिखाएगा:

d -> c

इसके बजाय lsदिखाने के लिए या किसी अन्य लिनक्स कमांड के लिए एक रास्ता है d -> c -> b -> a?


मैंने इसे stackoverflow.com/questions/2320277/… के रूप में पोस्ट किया है। मुझे आशा है कि आपको कोई आपत्ति नहीं है।
पॉल

जवाबों:


65

बस उपयोग करें namei:

$ namei d
f: d
 l d -> c
   l c -> b
     l b -> a
       d a

5
टीआईएल। यह एक कूल कमांड है। अपवोट्स
टॉम ओ'कॉनर

यह स्वीकृत उत्तर होना चाहिए, क्योंकि यह ऑप में अनुरोध किए गए लिंक की पूरी श्रृंखला दिखाता है। इसके अलावा इसका उपयोग पूरी निर्देशिका को समान करने के लिए किया जा सकता है ls। धन्यवाद!
फोबिक

वास्तव में, इस पोस्ट और नाम में एक अद्भुत आदेश है!
कालकेसर

किसी प्रोग्राम के वास्तविक उपयोग को खोजने के लिए "जो" कमांड के साथ उपयोग करें: $ namei `जो java`
pdem

18

readlink -e <link>

readlink [विकल्प] ... फ़ाइल

  • -, -
    दिए गए नाम के हर कंपोनेंट में हर सिम्कलिन का अनुसरण करके डिकोनाइज़िकल-मौजूदा कैनोनिकलाइज़ करें, सभी कंपोनेंट्स मौजूद होने चाहिए
$ mkdir testlink
$ cd testlink
pjb@pjb-desktop:~/testlink$ ln -s c b
pjb@pjb-desktop:~/testlink$ ln -s b a
pjb@pjb-desktop:~/testlink$ ls -l 
total 0
lrwxrwxrwx 1 pjb pjb 1 2010-02-23 08:48 a -> b
lrwxrwxrwx 1 pjb pjb 1 2010-02-23 08:48 b -> c
pjb@pjb-desktop:~/testlink$ echo foo > c
pjb@pjb-desktop:~/testlink$ cat a
foo
pjb@pjb-desktop:~/testlink$ readlink -e a
/home/pjb/testlink/c

नोट: एक बार फिर से पढ़ने वाला b

नोट # 2: साथ में ढूँढें -l, चेन को सूचीबद्ध करने के लिए एक उपयोगिता आसानी से पर्ल में लिखी जा सकती है, लेकिन लूप का पता लगाने के लिए पर्याप्त स्मार्ट होना चाहिए

अगर आपके पास एक लूप है तो रीडिंक कुछ भी आउटपुट नहीं करेगा। यह अटक जाने से बेहतर है, मुझे लगता है।

pjb@pjb-desktop:~/testlink$ ln -sf a c
pjb@pjb-desktop:~/testlink$ ls -l 
total 0
lrwxrwxrwx 1 pjb pjb 1 2010-02-23 08:48 a -> b
lrwxrwxrwx 1 pjb pjb 1 2010-02-23 08:48 b -> c
lrwxrwxrwx 1 pjb pjb 1 2010-02-23 09:03 c -> a
pjb@pjb-desktop:~/testlink$ readlink -e a
pjb@pjb-desktop:~/testlink$ # (note: no output)

ओएस एक्स पर: brew install coreutilsऔरgreadlink -e <link>
जोस अल्बन

3

यहाँ बैश में एक पुनरावर्ती कार्य है:

chain() { export chain; local link target; if [[ -z $chain ]]; then chain="$1"; fi; link=$(stat --printf=%N $1); while [[ $link =~ \-\> ]]; do target="${link##*\`}"; target="${target%\'}"; chain+=" -> $target"; chain "$target"; return; done; echo "$chain"; unset chain; }

कई लाइनों पर:

chain() {
    export chain
    local link target
    if [[ -z $chain ]]
    then
        chain="$1"
    fi
    link=$(stat --printf=%N "$1")
    while [[ $link =~ \-\> ]]
    do
        target="${link##*\`}"
        target="${target%\'}"
        chain+=" -> $target"
        if [[ ! $target =~ / && $1 =~ / ]]
        then
            target="${1%/*}/$target"
        fi
        chain "$target"
        return
    done
    echo "$chain"
    unset chain
}

उदाहरण:

$ chain d
d -> c -> b -> a
$ chain c
c -> b -> a
$ chain a
a

इसकी आवश्यकता है stat(1)जो कुछ प्रणालियों पर मौजूद नहीं हो सकता है।

यदि नाम बैकटिक्स, एकल उद्धरण, या "->" शामिल हैं तो यह विफल हो जाएगा। यह सिंपलिस लूप्स के साथ एक लूप में फंस जाता है (इसे बैश 4 में एक साहचर्य सरणी का उपयोग करके हल किया जा सकता है)। यह "चेन" नामक एक चर का निर्यात करता है, बिना इस बात के कि क्या यह पहले से उपयोग में है।

इसके साथ अन्य समस्याएं हो सकती हैं।

संपादित करें:

कुछ रिश्तेदार सहानुभूति के साथ एक समस्या को ठीक किया। कुछ अभी भी काम नहीं करते हैं, लेकिन नीचे दिए गए संस्करण में मौजूद लिंक के लक्ष्य की आवश्यकता नहीं है।

एक ऐसा संस्करण जोड़ा गया जो रीडलिंक का उपयोग करता है:

chain ()
{
    export chain;
    local target;
    if [[ -z $chain ]]; then
        chain="$1";
    fi;
    target=$(readlink "$1");
    while [[ $target ]]; do
        chain+=" -> $target";
        if [[ ! $target =~ / && $1 =~ / ]]
        then
            target="${1%/*}/$target"
        fi
        chain "$target";
        return;
    done;
    echo "$chain";
    unset chain
}

मैंने आपकी स्क्रिप्ट का परीक्षण किया है और यह वास्तव में काम करता है लेकिन मैं कुछ सरल पसंद करता हूं इसलिए मैंने अधूरा होने पर भी अन्य उत्तर को स्वीकार किया है।
कालकेसर

1
अच्छी स्क्रिप्ट है। कभी-कभी मैं पूरी श्रृंखला देखना चाहता हूं, और readlinkऐसा प्रतीत नहीं होता। जावा उबंटू पर है:/usr/bin/java -> /etc/alternatives/java -> /usr/lib/jvm/java-6-openjdk/jre/bin/java
स्टीफन लासिवस्की

0

आप सिर्फ नामी के उत्पादन को कुछ इस तरह awkसे पोस्ट grepकर सकते हैं जैसे आप चाहते हैं कि बस लाइनें मिलें :

namei d | awk '$1=="l"'

या

namei d | egrep -e "->"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.