लिंक को लक्षित करने के लिए पूर्ण पथ कैसे प्राप्त करें


13

अगर मेरे पास एक प्रतीकात्मक लिंक /var/opt/fooहै ln -fs /path/to/target/dir foo। मैं एक स्क्रिप्ट में कैसे देख सकता हूं जो केवल लिंक प्राप्त करता है /path/to/target/dir?

rm -rf /path/to/target/dirइससे पहले कि मैं स्क्रिप्ट में क्या हासिल करना चाहता हूं ln -fs /path/to/another/dir foo

जवाबों:


30
link=/var/opt/foo

target=$(readlink "$link")

$target अब लिंक का लक्ष्य है, बिल्कुल वैसा ही जैसा कि फाइलसिस्टम में संग्रहीत था।

साइमलिंक सापेक्ष हो सकते हैं, हालांकि, यह सामान्य उपयोग के लिए बेहतर होगा:

target=$(readlink -f "$link")

ध्यान दें कि यह readlinkGNU Coreutils से उपयोग होता है, जो बीएसडी और अन्य प्रणालियों में मौजूद नहीं हो सकता है।

संपादित करें: readlink -f बीएसडी पर काम करता है, जब तक लिंक लक्ष्य मौजूद है। realpathएक और, बीएसडी-ओनली, टूल है जो समान तरीके से काम करता है।


1
बीएसडीएस के पास readlink()4.2BSD के दिनों से एक सिस्टम कॉल है। बीएसडी की वर्तमान readlink उपयोगिता को फ्रीबीएसडी 4.10 के साथ जारी किया गया था। यह (re) statकमांड के लिए एक कड़ी के रूप में लागू किया गया था ( MacOS X मैनुअल पेज FreeBSD 9 मैनुअल पेज )। ध्यान दें कि इसका कोई -mविकल्प नहीं है ।
JdeBP

@JdeBP: धन्यवाद। यह है -f, और readlink -fबस के रूप में अच्छी तरह से काम करता है (लिंक लक्ष्य मौजूद है)। बीएसडी में, realpathएक और विकल्प प्रतीत होता है readlink -m
user1686

0

एक तरीका है (मैं एक बेहतर संस्करण की उम्मीद कर रहा हूं)

olddir=$(pwd)
cd /var/opt/foo
deleteme=$(pwd)
cd $olddir
rm -rf "$olddir"

4
readlinkआपका दोस्त है।
JdeBP
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.