जवाबों:
-f
Canonicalized संस्करण को मुद्रित करने के लिए ध्वज का उपयोग करें । उदाहरण के लिए:
readlink -f /root/Public/myothertextfile.txt
से man readlink
:
-f, --canonicalize
canonicalize by following every symlink in every component of the given name recursively; all but the last component must exist
brew install coreutils
। यह अक्षर के साथ उपसर्ग किए गए कमांडों के मूल गनु संस्करणों को स्थापित करता है g
, अर्थातgreadlink -f somefile
Ubuntu 18.04.1 LTS (Bionic Beaver)
readlink की manpages एक नोट कह दिया है "ध्यान दें realpath (1) कैनॉनिकलाइज़ेशन कार्यक्षमता के लिए उपयोग करने के लिए पसंदीदा आदेश है।"
पठन आप चाहते हैं कमांड है। आपको कमांड के लिए मैन पेज देखना चाहिए। क्योंकि यदि आप वास्तविक फ़ाइल में प्रतीकात्मक लिंक की एक श्रृंखला का पालन करना चाहते हैं, तो आपको -e या -f स्विच की आवश्यकता है:
$ ln -s foooooo zipzip # fooooo doesn't actually exist
$ ln -s zipzip zapzap
$ # Follows it, but doesn't let you know the file doesn't actually exist
$ readlink -f zapzap
/home/kbrandt/scrap/foooooo
$ # Follows it, but file not there
$ readlink -e zapzap
$ # Follows it, but just to the next symlink
$ readlink zapzap
zipzip
यह भी काम करेगा:
ls -l /root/Public/myothertextfile.txt
लेकिन readlink
पार्सिंग के बजाय स्क्रिप्ट में उपयोग के लिए पसंद किया जाएगा ls
।
यदि आप स्रोत और लिंक के गंतव्य को दिखाना चाहते हैं, तो प्रयास करें stat -c%N files*
। उदाहरण के लिए
$ stat -c%N /dev/fd/*
‘/dev/fd/0’ -> ‘/dev/pts/4’
‘/dev/fd/1’ -> ‘/dev/pts/4’
यह पार्सिंग ( readlink
उस के लिए उपयोग ) के लिए अच्छा नहीं है , लेकिन यह अव्यवस्था के बिना लिंक नाम और गंतव्य दिखाता हैls -l
-c
लिखा जा सकता है --format
और %N
इसका मतलब है "प्रतीकात्मक लिंक अगर द्वैधता के साथ उद्धृत फ़ाइल नाम"।
readlink
एक अच्छी बात है, लेकिन जीएनयू विशेष और गैर क्रॉस प्लेटफॉर्म। मैं इसके लिए क्रॉस प्लेटफ़ॉर्म स्क्रिप्ट्स लिखता था /bin/sh
, इसलिए मैं कुछ इस तरह इस्तेमाल करता:
ls -l /root/Public/myothertextfile.txt | awk '{print $NF}'
या:
ls -l /root/Public/myothertextfile.txt | awk -F"-> " '{print $2}'
लेकिन इनका विभिन्न प्लेटफार्मों पर परीक्षण किए जाने की आवश्यकता है। मुझे लगता है कि वे काम करेंगे, लेकिन ls
आउटपुट प्रारूप के लिए 100% निश्चित नहीं हैं ।
बाहरी आदेश जैसे , या के आधार पर बिना परिणाम के ls
भी पार्स किया जा सकता है ।bash
awk
sed
perl
यह bash_realpath
फ़ंक्शन किसी लिंक के अंतिम गंतव्य (लिंक → लिंक → लिंक → फाइनल) को हल करता है:
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}"
}
यदि आप उपयोग नहीं कर सकते हैं readlink
, तो परिणाम को पार्स करना ls -l
इस तरह से किया जा सकता है।
सामान्य परिणाम होगा:
ls -l /root/Public/myothertextfile.txt
lrwxrwxrwx 1 root root 30 Jan 1 12:00 /root/Public/myothertextfile.txt -> /root/Public/mytextfile.txt
इसलिए हम "->" से पहले सब कुछ बदलना चाहते हैं और इसमें शामिल तीर हैं। हम इसके लिए उपयोग कर सकते हैं sed
:
ls -l /root/Public/myothertextfile.txt | sed 's/^.* -> //'
/root/Public/mytextfile.txt
प्रश्न ब्रायन-ब्रेज़िल के रूप में एक सरल उत्तर देने के लिए पर्याप्त सटीक नहीं है:
readlink -f some_path
वास्तव में पथ निर्माण में शामिल प्रत्येक सहयात्री को अंतिम लक्ष्य तक पीछे ले जाएगा some_path
।
लेकिन सिस्किंलिग का एक स्तर सिम्बलिंक का एक सिस्टम में दूसरों के बीच सिर्फ एक विशेष मामला है, सामान्य मामला कैस्केडिंग सिम्बलिंक का एन लेवल है। मेरे सिस्टम पर निम्नलिखित देखें:
$ rwhich emacs
/usr/bin/emacs
/etc/alternatives/emacs
/usr/bin/emacs24-x
rwhich
मेरी खुद की पुनरावर्ती कार्यान्वयन है which
कि सभी मध्यवर्ती कैस्केडिंग सिम्लिंक (स्टडर्र) को अंतिम लक्ष्य (स्टडआउट) तक प्रिंट करता है।
फिर अगर मैं जानना चाहता हूं कि क्या है:
सिमलिंक / यूएसआर / बिन / ईमेक ** का लक्ष्य , मेरे लिए स्पष्ट उत्तर इस प्रकार /etc/alternatives/emacs
है:
readlink $(which emacs)
readlink /usr/bin/emacs
अंतिम व्यापक सिमलिंक के पीछे लक्ष्य / usr / bin / Emacs, जवाब किया जाएगा /usr/bin/emacs24-x
के रूप में द्वारा दिया:
readlink -f $(which emacs)
readlink -f /usr/bin/emacs
rwhich emacs 2>/dev/null
यदि आप एक फ़ोल्डर के भीतर सभी लिंक का लक्ष्य पाते हैं और उसके सबफ़ोल्डर find . -type l -ls
निम्नानुसार लिंक प्रकार के साथ कमांड का उपयोग करते हैं:
me@local.localdomain:~/test$ find . -type l -ls
8601855888 0 lrwxr-xr-x 1 me staff 6 Jan 24 19:53 ./link -> target
यदि आप एकल का लक्ष्य चाहते हैं, तो ls -l
काम करना चाहिए:
me@local.localdomain:~/test$ ls -l
total 0
lrwxr-xr-x 1 me staff 6 Jan 24 19:53 link -> target
-rw-r--r-- 1 me staff 0 Jan 24 19:53 target
readlink -f
।