एक नरम प्रतीकात्मक लिंक की मूल फ़ाइल का पूरा रास्ता कैसे प्राप्त करें?


99

मैं scpएक सर्वर के लिए एक फ़ाइल चाहते हैं । फ़ाइल एक प्रतीकात्मक लिंक है, और वास्तव में मैं जो करना चाहता हूं वह स्रोत फ़ाइल की प्रतिलिपि बना रहा है। वैसे भी मैं स्रोत फ़ाइल के पथ को मैन्युअल रूप से ट्रैक नहीं करना चाहता, क्योंकि इसे बदला जा सकता है। अगर मुझे स्रोत फ़ाइल का पूर्ण पथ मिल सकता है, तो मैं इसके sepसाथ हो सकता हूं । मुझे रास्ता कैसे मिल सकता है?


2
अधिकांश scpसंस्करण डिफ़ॉल्ट रूप से सिम्लिंक का पालन करते हैं, क्या वे नहीं? आपको अपनी जाँच करनी चाहिए और शायद अपने आप को कुछ काम बचाना चाहिए।
jw013

@ jw103 मुझे यह बताने के लिए धन्यवाद। मुझे नहीं पता था। :)
Eonil

2
नोट: scp -rसहानुभूति के बाद बल।
Eonil

जवाबों:


129

इस लाइन को आज़माएं:

readlink -f `which command`

यदि commandआपके $PATHचर में है, अन्यथा आपको उस मार्ग को निर्दिष्ट करने की आवश्यकता है जिसे आप जानते हैं।


12
-fएक गैर-मौजूद अंतिम लक्ष्य के लिए एक रास्ता लौटेगा, इसलिए जब तक मध्यवर्ती लिंक लक्ष्य मौजूद हैं ... -eइस से बचने के लिए उपयोग करें, अर्थात। -eअंतिम लक्ष्य मौजूद नहीं होने पर अशक्त हो जाएगा।
पीटर.ऑक्ट

10
-fसाथ errored readlink: illegal option -- fOSX में। इसे हटाकर ठीक काम हुआ।
हीथ बॉर्डर

2
अगर आप homebrew coreutils स्थापित कर सकते हैं, तो आप greadlinkइसके बजाय भी उपयोग कर सकते हैं ।
एडम जेंट

23

लिनक्स के तहत, readlinkएक सिम्लिंक की सामग्री को पढ़ता है, और readlink -fसिम्बलिंक के लिए सिमिलिंक का अनुसरण करता है, आदि, जब तक कि यह कुछ ऐसा नहीं पाता है जो सिम्लिंक नहीं है।

हालाँकि, यह scp के लिए आवश्यक नहीं है: scp हमेशा symlinks का अनुसरण करता है (यह हमेशा फ़ाइल सामग्री की प्रतिलिपि बनाता है, मेटाडेटा को अनदेखा करता है, सिवाय इसके कि -pफ़ाइल समय और मोड को संरक्षित करता है)।

यदि आप अपने आप को निराश करते हैं कि मेटाडेटा एससीपी क्या है और संरक्षित नहीं कर सकता है, तो मैं सुझाव देता हूं कि rsync का उपयोग करें। कोई विकल्प नहीं होने के साथ, rsync प्रतियां मेटाडेटा की अनदेखी करने वाली फ़ाइल सामग्री की प्रतिलिपि बनाती हैं। आमतौर पर इस्तेमाल किया जाने वाला विकल्प -aसभी उद्यान-विविधता मेटाडेटा (समय, प्रतीकात्मक लिंक, अनुमतियां और स्वामित्व) को संरक्षित करता है, और एसीएल और हार्ड लिंक जैसे विदेशी मेटाडेटा को संरक्षित करने के लिए विकल्प हैं।


रीड लिंकिंग के लिए केवल एक कदम ही पढ़ें। उदाहरण के लिए ubuntu में हमारे पास / bin / zsh है, जिसे / etc / विकल्प / zsh के लिए सहानुभूति दी गई है, लेकिन यह दूसरा symlink है। अंत में हमें वास्तविक फ़ाइल या निर्देशिका पथ नहीं मिलेगा। ऐसा ही स्टेट कमांड के साथ है। केवल -f विकल्प के साथ केवल पढ़ने के लिए हल करता है।
ज़नीक

9

मैं आदेश का उपयोग करें ls, stat, readlink

/etc/localtimeएक उदाहरण के रूप में फ़ाइल ले लो

[flying@lempstacker ~]$ ls /etc/localtime 
/etc/localtime
[flying@lempstacker ~]$ ls -l /etc/localtime
lrwxrwxrwx. 1 root root 35 Aug  2 22:41 /etc/localtime -> ../usr/share/zoneinfo/Asia/Shanghai

ऑपरेशन

स्टेट का उपयोग करना

[flying@lempstacker ~]$ stat /etc/localtime
  File: ‘/etc/localtime’ -> ‘../usr/share/zoneinfo/Asia/Shanghai’
  Size: 35          Blocks: 0          IO Block: 4096   symbolic link
Device: fd01h/64769d    Inode: 272202388   Links: 1
Access: (0777/lrwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2016-11-23 09:00:59.999887800 +0800
Modify: 2016-08-02 22:41:26.090389904 +0800
Change: 2016-08-02 22:41:26.090389904 +0800
 Birth: -
[flying@lempstacker ~]$ stat -c "%N" /etc/localtime
‘/etc/localtime’ -> ‘../usr/share/zoneinfo/Asia/Shanghai’

रीडलिंक का उपयोग करना

[flying@lempstacker ~]$ readlink /etc/localtime
../usr/share/zoneinfo/Asia/Shanghai
[flying@lempstacker ~]$ readlink -f /etc/localtime
/usr/share/zoneinfo/Asia/Shanghai

ऐसा लगता है कि कमान readlink -fबेहतर है।

व्याख्या

-f, --canonicalize: दिए गए नाम के हर कंपोनेंट में हर सिम्कलिन का अनुसरण करके कैनोनिकलाइज़ करें; सभी लेकिन अंतिम घटक मौजूद होना चाहिए - सेman readlink


6

स्टेटमेंट आपको यह जानकारी देगा:

$ stat current
  File: `current' -> `/home/user/releases/build/'
  ...

रीड लिंकिंग के लिए केवल एक कदम ही पढ़ें। उदाहरण के लिए ubuntu में हमारे पास / bin / zsh है, जिसे / etc / विकल्प / zsh के लिए सहानुभूति दी गई है, लेकिन यह दूसरा symlink है। अंत में हमें वास्तविक फ़ाइल या निर्देशिका पथ नहीं मिलेगा। ऐसा ही स्टेट कमांड के साथ है। केवल -f विकल्प के साथ केवल पढ़ने के लिए हल करता है।
ज़नीक

5

आप या तो कर सकते हैं

readlink -f `which command`

या आप लिनक्स में कुछ ऐसा ही प्राप्त कर सकते हैं

stat `which command` | grep File

यदि आप इसे स्क्रिप्ट में जोड़ रहे हैं, तो त्रुटि का निरीक्षण करें। यदि आप इस मामले में त्रुटि संदेश नहीं देखना चाहते हैं जब सहानुभूति लिंक नहीं है, तो कुछ इस तरह से जाएं

readlink -f "`which command`" 

स्टेट और रिंक बिना -f केवल सिंगल स्टेप करते हैं। तो बेहतर कॉल पढ़ने के लिए।
ज़नीक

3

मैं उपयोग करूंगा realpath <symlink>

संभवतः जिसे आप 'स्रोत' कहते हैं, वह 'लक्ष्य' फ़ाइल है, जिसके उपयोग के अनुसार ln:Usage: ln [OPTION]... [-T] TARGET LINK_NAME


धन्यवाद यह एक आकर्षण की तरह काम किया! मैक OSX के साथ! यह कहाँ readlinkनहीं काटा ... बेवकूफ मैक। lol
JayRizzo

0

readlink -f 'which java' मेरे लिए काम नहीं किया।

लेकिन यह किया:

readlink -f $(which java)

3
काम नहीं किया क्योंकि यह `नहीं है '.. लेकिन $()वैसे भी बेहतर अभ्यास है।
स्टीफन राउच

नीच क्यों? मेरा जवाब एक स्वीकार्य विकल्प है, और, जैसा कि टिप्पणी कहती है, एक बेहतर अभ्यास है।
NonCreature0714

1
वोट डाउन करने वाले अधिकांश लोग भी टिप्पणी नहीं करते हैं, इसलिए डाउन वोट का स्पष्टीकरण मांगने से आपको शायद ही कोई स्पष्टीकरण मिलेगा, क्योंकि नीचे का मतदाता पहले ही निकल चुका है और उसके वापस आने की संभावना नहीं है। मैं आपको सुझाव दूंगा कि आप अपने जवाब से काम न करने वाले टाइपो कोड को हटा दें। यदि आप इसे साफ करने के लिए समय निकालते हैं और $()बेहतर अभ्यास क्यों करते हैं , तो मैं वोट देने के लिए तैयार हूं ।
स्टीफन राउच

जैसा कि स्टीफन ने आपको समझाया, 'नहीं है'। आपको इसके द्वारा एनकैप्सुलेट करना चाहिए command, लेकिन यह पदावनत है। $ () का उपयोग करना बेहतर है, क्योंकि एनकैप्सुलेशन $ ($ (कमांड)) बहुत आसान है और विशेष भागने की आवश्यकता नहीं है। फिर इसे पसंद किया जाता है। अपने पहले उदाहरण में आपने सामान्य रूप से एपोस्ट्रोपी का उपयोग किया था, फिर रीडलिंक अपने नाम में स्पेस के साथ 'किस जावा' नाम की फाइल खोजने की कोशिश कर रहा है। लेकिन आपका इरादा कॉल कमांड है जो तर्क जावा के साथ जावा द्विआधारी निष्पादन योग्य मार्ग खोजने के लिए है।
ज़नीक

0

मैक ओएक्स पर, "-f" पैरामीटर काम नहीं करता है, 'रीडलिंक' बिना किसी पैरामीटर के काम करता है।

KZs-MacBook-Pro:bin kz$ readlink -f pip3
readlink: illegal option -- f
usage: readlink [-n] [file ...]

KZs-MacBook-Pro:bin kz$ readlink pip3
../../../Library/Frameworks/Python.framework/Versions/3.7/bin/pip3
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.