কেবলমাত্র সিমলিংকের গন্তব্য সন্ধান করুন


50

শেল স্ক্রিপ্টে ব্যবহারের জন্য, আমি একটি প্রতীকী লিঙ্কের গন্তব্য পাওয়ার জন্য একটি কমান্ডলাইন-উপায় সন্ধান করছি। আমি এখন পর্যন্ত সবচেয়ে কাছাকাছি এসেছি stat -N src, যা ফলাফল src -> dst। অবশ্যই আমি আউটপুটটি বিশ্লেষণ করতে এবং পেতে dstপারি তবে গন্তব্যটি পাওয়ার কোনও প্রত্যক্ষ উপায় আছে কিনা তা অবাক করি।

উত্তর:


61

আর একটি বিকল্প হ'ল readlinkযদি উপলভ্য হয় তবে বিশেষভাবে ডিজাইন করা কমান্ডটি ব্যবহার করা হবে ।

যেমন

$ readlink -f `command -v php`
/usr/bin/php7.1

21
ব্যবহার করুন readlink -fযদি আপনি জানতে চান গত সিমবলিক লিঙ্ক লক্ষ্য এবং শুধুমাত্র আগামী এক।
— স্কাই

ভাল যুক্তি! ভুলে গেছি
— নিকিতৌতু

11
নোট যে -fGNU- এ একটি বহনযোগ্য-বহনযোগ্য এক্সটেনশন readlink।
— বাহামাত

2
রিডলিঙ্ক কখন পাওয়া যাবে না? ধন্যবাদ।
— tommy.carstensen

2
@ tommy.carstensen রিডলিংক (1) 2003 সালে GNU কোর্টিলগুলিতে যুক্ত করা হয়েছিল, সুতরাং আজকাল আপনি সম্ভবত এটির ব্যবহারিকভাবে সমস্ত সিস্টেমের উপর নির্ভর করতে পারবেন কোর্টিল ব্যবহার করে। (সিএফ। Git.savannah.gnu.org/cgit/coreutils.git/commit/src/… )
— জোসিপ রডিন

16

ম্যাক ওএস এক্স এবং ফ্রিবিএসডি / নেটবিএসডি / ইত্যাদিতে। এটা:

stat -f %Y <filename>

আরও সাধারণভাবে আমি অনুমান করি সমাধানটি হল (স্ট্যাট - প্রিন্টফ =% এন অদ্ভুত উক্তি ব্যবহার করে):

ls -l b | sed -e 's/.* -> //'

উদাহরণ:

# ln -s a b
# stat -f %Y b
a

আরেকটি পদ্ধতি হ'ল:

# find b -maxdepth 0 -printf %l
a#

শেষ লাইনটি ম্যাঙ্গেল করা হয়েছে কারণ এটির কোনও নতুন লাইন নেই, তবে আপনার যদি ভেরিয়েবলের ফলাফলের প্রয়োজন হয় তবে এটি ঠিক আছে

# f=$(find b -maxdepth 0 -printf %l)
# echo $f
a

-maxdepthপ্রতিরোধ প্রয়োজন হয় findডিরেক্টরি মধ্যে সাজানো থেকে যদি bএকটি ডিরেক্টরি হতে হবে।


আমি সম্পূর্ণরূপে স্কিম মেরেছিলাম, stat --printf='%N\n'ঠিক আমি যা চাই তা চাই, অদ্ভুত উদ্ধৃতিগুলি আমাকে বিরক্ত করবেন না, তাদের একই উক্তিগুলি আরএম এবং এলএন
— ইন্টারেক্টিভ

এটি আপাতদৃষ্টিতে পোর্টেবল নয় কারণ লিনাক্সে, জিএনইউ কোর্টিলস স্ট্যাট (1) এর বিভিন্ন পরামিতি রয়েছে এবং link -> destআউটপুট প্রিন্ট করে । (1) সমাধানটি জিএনইউ অনুসন্ধানকারীর সাথে অন্যথায় আছে কিনা তা যাচাই করা উচিত ...
— জোসিপ রডিন

দয়া করে আপনার পরিবর্তনশীল বিস্তৃতি উদ্ধৃত করতে ভুলবেন না, echo $fযখন /*
— সিমলিংকটি

3

এই গনুহ ব্যবহার করা যেতে পারে find: find src -prune -printf "%l\n"।


1

বহনযোগ্যভাবে: এলএস-এল আউটপুট পার্স করতে বা ব্যবহারের জন্য হিউরিস্টিক্স ব্যবহার ছাড়া ভাগ্য নেই perl -le 'print readlink("some-file")'

কিছু সিস্টেমে একটি readlinkকমান্ড থাকে, কিছুগুলির সাথে -fপরম পাথ পাওয়ার বিকল্প রয়েছে।

একটা বিভিন্ন বাস্তবায়নের হয় statএকটি মোড়কের যেমন কমান্ড stat/ lstatসিস্টেম কল। জিএনইউ ওয়ান সে ক্ষেত্রে কার্যকর নয়, তবে zsh এর বিল্টিনটি আরও তাই:

zmodload zsh/stat
stat +link the-link

তবুও zsh সহ, আপনি কোনও ফাইলের পরম পাথটি (প্রতিটি সিমলিংক উপাদান সরিয়ে ফেলতে পারেন) :Aপরিবর্তকটির সাথে পেতে পারেন (ভেরিয়েবল সম্প্রসারণ, ইতিহাস সম্প্রসারণ এবং গ্লোববিংয়ের ক্ষেত্রে প্রযোজ্য:

~$ gstat -c %N b
`b' -> `a'
~$ var=b
~$ echo $var:A
/home/me/a
~$ echo b(:A)
/home/me/a
~$ echo ?(@:A)
/home/me/a

1

এমন একটি সিস্টেমে যেখানে আমার নেই readlinkবা statকমান্ড নেই তবে পাইথন ২.x রয়েছে, আমি একটি শর্ট স্ক্রিপ্ট ব্যবহার করছি:

#!/usr/bin/env python

import os, sys

if __name__ == "__main__":
    src = sys.argv[1]
    target = os.readlink(src)
    if not os.path.isabs(target):
            target = os.path.abspath(os.path.join(os.path.dirname(src), target))
    print target

নোট করুন যে এটির বিপরীতে readlink -fকেবলমাত্র এক স্তর সিমলিংক অনুসরণ করা যেতে পারে।


1

পোর্টেবল খাঁটি বাশ রিয়েলপথ

bash_realpath() {
  # print the resolved path
  # @params
  # 1: the path to resolve
  # @return
  # &1: the resolved link path

  local path="${1}"
  while [[ -L ${path} && "$(ls -l "${path}")" =~ -\>\ (.*) ]]
  do
    path="${BASH_REMATCH[1]}"
  done
  echo "${path}"
}

0

realpathcoreutilsপ্যাকেজ কমান্ড ,

readlinkকমান্ডের ম্যানুয়াল পৃষ্ঠাতে লিঙ্ক হিসাবে ।


উদাহরণ স্বরূপ:

realpath /bin/python

আউটপুট

/usr/bin/python2.7

আমার মেশিনে

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