প্রতীকী লিঙ্ক চেইনগুলি কীভাবে তালিকাভুক্ত করবেন?


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?


আমি এটিকে স্ট্যাকওভারফ্লো.com/ প্রশ্নগুলি / 2320277/ … হিসাবে পোস্ট করেছি আশা করি আপনি আপত্তি করবেন না।
পল

উত্তর:


65

শুধু ব্যবহার করুন namei:

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

5
তিল। এটি একটি দুর্দান্ত আদেশ। upvotes
টম ও'কনোর

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত, কারণ এটি লিঙ্কগুলির সম্পূর্ণ শৃঙ্খলাটি ওপিতে অনুরোধ হিসাবে দেখায়। আরও এটির মতো একটি সম্পূর্ণ ডিরেক্টরি তালিকাতে ব্যবহার করা যেতে পারে ls। ধন্যবাদ!
ফোবিজ

প্রকৃতপক্ষে, এই পোস্টটি পুনর্বিবেচনা করা হয়েছিল এবং নামি একটি দুর্দান্ত আদেশ!
ক্যালেকার

কোনও প্রোগ্রামের আসল ব্যবহার সন্ধান করতে "কোন" কমান্ড দিয়ে ব্যবহার করুন: $ নামি `যা জাভা
পিডিএম

18

readlink -e <link>

পঠন লিঙ্ক [বিকল্প] ... ফাইল

  • -e, --canonicalize- বিদ্যমান
    canonicalize প্রদত্ত নামের প্রতিটি উপাদান প্রতিটি syMLink অনুসরণ করে পুনরাবৃত্তিভাবে, সমস্ত উপাদান উপস্থিত থাকতে হবে
$ 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

দ্রষ্টব্য: পঠন লিঙ্ক নিজেই ফেরত খ

নোট # 2: ফাইন্ড-এল এর সাথে একসাথে চেইনগুলি তালিকাভুক্ত করার জন্য একটি ইউটিলিটি সহজে পার্লে লেখা যেতে পারে তবে লুপগুলি সনাক্ত করতে যথেষ্ট স্মার্ট থাকতে হবে

আপনার কাছে লুপ থাকলে রিডলিঙ্ক কিছুই আউটপুট দেয় না। আটকে যাওয়ার চেয়ে এটিই ভাল, আমি মনে করি।

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 এ কোনও এসোসিয়েটিভ অ্যারে ব্যবহার করে সমাধান করা যেতে পারে)। এটি ইতিমধ্যে ব্যবহৃত হয়েছে কিনা তা বিবেচনা না করে "চেইন" নামক একটি পরিবর্তনশীল রফতানি করে।

এটির সাথে অন্যান্য সমস্যাও থাকতে পারে।

সম্পাদনা:

কিছু আপেক্ষিক symlinks সঙ্গে একটি সমস্যা স্থির। কিছু এখনও কাজ করে না, তবে নীচের সংস্করণটির জন্য লিঙ্কটির উপস্থিতির লক্ষ্যের প্রয়োজন নেই।

রিডলিঙ্ক ব্যবহার করে এমন একটি সংস্করণ যুক্ত করা হয়েছে:

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 "->"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.