কিভাবে লিনাক্সে একটি সিমলিংকের স্তরটি জানবেন?


3

উদাহরণস্বরূপ, যদি একটি সিমিলিংক হয়

a -> b
b -> c
c -> d

বলুন, a এর syMLink স্তর 3।

তাহলে, এই তথ্যটি পাওয়ার কোনও ইউটিলিটি আছে? এবং, এছাড়াও আমি একটি সিমিলিংকের সম্প্রসারণের বিশদ পেতে চাই, যা আমাকে এরকম কিছু দেখাবে:

1. /abc/xyz is expanded to /abc/xy/z (lrwx--x--x root root)
2. /abc/xy/z is expanded to /abc/xy-1.3.2/z (lrwx--x--x root root)
3. /abc/xy-1.3.2/z is expanded to /abc/xy-1.3.2/z-4.6 (lrwx--x--x root root)
4. /abc/xy-1.3.2/z-4.6 is expanded to /storage/121/43/z_4_6 (lrwx--x--x root root)
5. /storage/121/43/z_4_6 is expanded to /media/kitty_3135/43/z_4_6 (lrwx--x--x root root)

তাই আমি সিমলিঙ্কগুলি দিয়ে ডায়াগনস্টিক করতে পারি। কোন ধারণা?

উত্তর:


5

এই পুনরাবৃত্তাকার বাশ ফাংশনটি ডায়াগোনস্টিকের সাথে লিঙ্ক চেইন এবং গণনা প্রিন্ট করবে:

chain() { local link target; if [[ -z $_chain ]]; then unset _chain_count _expansion; _chain="$1"; fi; link=$(stat --printf=%N $1); while [[ $link =~ \-\> ]]; do target="${link##*\`}"; target="${target%\'}"; _chain+=" -> $target"; ((_chain_count++)); _expansion+="$_chain_count. $1 is expanded to $target $(stat --printf="(%A %U %G)" $target)"$'\n'; chain "$target"; return; done; echo "$_chain ($_chain_count)"; echo "$_expansion"; unset _chain _chain_count _expansion; }

এটি প্রয়োজন statreadlinkপরিবর্তে ব্যবহার করা আরও তথ্যের এবং সংস্করণের জন্য stat, আমার উত্তরটি এখানে দেখুন (গণনা বৈশিষ্ট্যটি যুক্ত করা দরকার তবে অনুমতি এবং মালিক / গোষ্ঠী যুক্ত করা আরও কিছুটা চ্যালেঞ্জিং হবে)।

এর জন্য:

a
b -> a
c -> b
d -> c

এর ফলাফল chain dহবে:

d -> c -> b -> a (3)
1. d is expanded to c (lrwxrwxrwx username groupname)
2. c is expanded to b (lrwxrwxrwx username groupname)
3. b is expanded to a (-rw-r--r-- root root)

ফাংশনের আরও পঠনযোগ্য সংস্করণটি এখানে:

chain ()
{
    local link target;
    if [[ -z $_chain ]]; then
        unset _chain_count _expansion;
        _chain="$1";
    fi;
    link=$(stat --printf=%N $1);
    while [[ $link =~ \-\> ]]; do
        target="${link##*\`}";
        target="${target%\'}";
        _chain+=" -> $target";
        ((_chain_count++));
        _expansion+="$_chain_count. $1 is expanded to $target $(stat --printf="(%A %U %G)" $target)"$'\n';
        chain "$target";
        return;
    done;
    echo "$_chain ($_chain_count)";
    echo "$_expansion";
    unset _chain _chain_count _expansion
}

মনে হচ্ছে ওয়ান-লাইনার এবং বিস্ফোরিত সংস্করণের মধ্যে সংযোগ বিচ্ছিন্ন। (বিস্ফোরণে টাইপো সম্ভবত?) মনে হচ্ছে কিছুক্ষণ $'\nপরেই অনুপস্থিত $(stat। কেবলমাত্র ';এটির সাথে অদ্ভুত বিন্দুযুক্ত রেখা অবিলম্বে অনুপস্থিত অক্ষরগুলি অনুসরণ করে।
কোয়াকোট কোয়েসোট

অন্যথায়, সুন্দর সামান্য ওয়ান-লাইনার। অনেক প্রশংসিত.
কোয়াকোট কোয়েসোট

@ কোয়াক: এটি নির্দেশ করার জন্য ধন্যবাদ। আমি আমার উত্তরটি প্রুফড করার সময় এটিকে মিস করেছি।
ডেনিস উইলিয়ামসন

2

এটি প্রকৃতপক্ষে বরং জটিল, কারণ আপনার কাছে একটি সিমলিংক থাকতে পারে:

ln -s ../symlink/xyz pqr

যেখানে 'syMLink' নিজেই কিছু স্বেচ্ছাসেবী দৈর্ঘ্যের একটি সিমিলিংক। আমার একটি প্রোগ্রাম রয়েছে যা একই কাজ করে realpath()তবে যা পথে সমস্ত সিমলিংকের সুরক্ষাও পরীক্ষা করে। যেমন, এটি আপনার প্রশ্নের উত্তর দেওয়ার জন্য ব্যবহার করা যেতে পারে। এবং এর কয়েকটি পরীক্ষা স্ক্রিপ্টগুলি আপনার গণনাগুলি বৈধ করতে ব্যবহার করা যেতে পারে।

এটি এমন একটি পরীক্ষা:

#!/bin/ksh
#
# @(#)$Id: realpathtest.sh,v 1.4 2008/04/14 19:36:54 jleffler Exp $
#
# Create confusing path names

base=${1:-"./rpt"}

mkdir -p $base/elsewhere/confused $base/elsewhere/hidden \
         $base/other/place $base/elsewhere/private

(
cd $base
[ -h link ] || ln -s elsewhere/confused link
[ -h some ] || ln -s other/place some
)
(
cd $base/elsewhere/confused
[ -h mischief ] || ln -s ../hidden mischief
[ -h where    ] || ln -s ../private where
)
(
cd $base/other/place
[ -h dubious  ] || ln -s ../../link/mischief dubious
[ -h doubtful ] || ln -s ../../link/where doubtful
)
(
cd $base/elsewhere/private
echo "What is the real pathname for $base/some/doubtful/file?" > file
)
(
cd $base/elsewhere/hidden
[ -h file ] || ln -s name file
echo "What is the real pathname for $base/some/dubious/file?" > name
)

for name in \
    $base/some/dubious/file \
    $base/some/doubtful/file \
    $base/elsewhere/confused/mischief/file \
    $base/elsewhere/confused/where/file
do
    if realpath $name
    then cat $(realpath -s $name)
    fi
done

আপনি যদি 'রিয়েলপথ' বা 'লিঙ্কপথ' প্রোগ্রামের উত্স চান তবে আমার সাথে যোগাযোগ করুন (আমার প্রোফাইল দেখুন); । 'রিয়েলপথ' প্রোগ্রামটি যদিও রকেট বিজ্ঞান নয় - এটি মূলত realpath()এটি দেওয়া প্রতিটি যুক্তির জন্য আহ্বান জানায় । সম্পূর্ণ লিঙ্কগুলির সম্পূর্ণ সেট বিশ্লেষণে আরও অনেক প্রচেষ্টা জড়িত।


2

আমি সত্যিই কোন ইউটিলিটি সম্পর্কে জানি না। আপনি এটি বেশ সহজেই স্ক্রিপ্ট করতে পারেন। কিছু স্ট্যাট বা এলএস আউটপুট যুক্ত করা আপনাকে সম্ভবত বাকি পথটি পেতে পারে।

#!/bin/sh

level=0
file=$1
while [ -h "$file" ]
do
    previous="$file"
    file=`readlink "$file"`
    level=$(($level+1))
    echo "$level". "$previous -> $file"
done

আমার হোমডিরে সেট আপ করা কয়েকটি লিঙ্কে এটি ব্যবহার করে আমি পেয়েছি:

$ ./test.sh link2
1. link2 -> link1
2. link1 -> Test.java
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.