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


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.