कमांड लाइन के माध्यम से प्रतीकात्मक लिंक लक्ष्य का पता लगाएं


129

कहते हैं कि मैं एक प्रतीकात्मक लिंक सेटअप करता हूं:

ln -s /root/Public/mytextfile.txt /root/Public/myothertextfile.txt

क्या यह देखने का एक तरीका myothertextfile.txtहै कि कमांड लाइन का उपयोग करने का लक्ष्य क्या है?

जवाबों:


170

-fCanonicalized संस्करण को मुद्रित करने के लिए ध्वज का उपयोग करें । उदाहरण के लिए:

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

8
जैसा कि एक अन्य प्रश्न में सुझाया गया है , आप उपयोग करना चाह सकते हैं readlink -f
डेनिलसन सिया मिया

5
मैक ओएस एक्स पर इस कार्य करवाने के लिए, brew install coreutils। यह अक्षर के साथ उपसर्ग किए गए कमांडों के मूल गनु संस्करणों को स्थापित करता है g, अर्थातgreadlink -f somefile
माइक डी

-f स्विच के साथ, कमांड मेरे मामले में कुछ भी नहीं देता है ..
8

प्रयोग -f ने मुझे वह जानकारी दी जो मैं चाहता था, यानी कई सिम्बल को हल करना और अंतिम लक्ष्य दिखाना।
isapir

पर Ubuntu 18.04.1 LTS (Bionic Beaver)readlink की manpages एक नोट कह दिया है "ध्यान दें realpath (1) कैनॉनिकलाइज़ेशन कार्यक्षमता के लिए उपयोग करने के लिए पसंदीदा आदेश है।"
सैम कामेन्स्की

23

पठन आप चाहते हैं कमांड है। आपको कमांड के लिए मैन पेज देखना चाहिए। क्योंकि यदि आप वास्तविक फ़ाइल में प्रतीकात्मक लिंक की एक श्रृंखला का पालन करना चाहते हैं, तो आपको -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

पहले उत्तर में कुछ भी गलत नहीं है, लेकिन यह अधिक पूर्ण और सहायक है।
माइक एस

6

यह भी काम करेगा:

ls -l /root/Public/myothertextfile.txt

लेकिन readlinkपार्सिंग के बजाय स्क्रिप्ट में उपयोग के लिए पसंद किया जाएगा ls


4

यदि आप स्रोत और लिंक के गंतव्य को दिखाना चाहते हैं, तो प्रयास करें 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इसका मतलब है "प्रतीकात्मक लिंक अगर द्वैधता के साथ उद्धृत फ़ाइल नाम"।


2

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भी पार्स किया जा सकता है ।bashawksedperl

यह 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}"
}

1

यदि आप उपयोग नहीं कर सकते हैं 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

1

प्रश्न ब्रायन-ब्रेज़िल के रूप में एक सरल उत्तर देने के लिए पर्याप्त सटीक नहीं है:

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
    

0

llया ls -lआपके प्रतीकात्मक लिंक सहित निर्देशिका वस्तुओं को सूचीबद्ध करना चाहिए और यह लक्ष्य है

cd -P /root/Public/myothertextfile.txt (आपके मामले में) मूल पथ को इंगित करना चाहिए


0

यदि आप एक फ़ोल्डर के भीतर सभी लिंक का लक्ष्य पाते हैं और उसके सबफ़ोल्डर 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.