2012-06-28 3 views
25

में निरपेक्ष पथ के सापेक्ष पथ परिवर्तित करने के लिए मैं कन्वर्ट करने के लिएकैसे यूनिक्स

सापेक्ष पथ चाहते हैं - /home/stevin/data/APP_SERVICE/../datafile.txt

को

निरपेक्ष पथ - /home/stevin/data/datafile.txt

वहाँ में निर्मित एक उपकरण है यूनिक्स ऐसा करने के लिए या कोई अच्छा विचार है कि मैं इसे कैसे कार्यान्वित कर सकता हूं।

-स्टीव

+0

शायद आप यह संकेत देने के लिए अपना प्रश्न अपडेट कर सकते हैं कि आपको ऐसा क्यों करना है। यह एक विशेषता है! सौभाग्य। – shellter

+0

मैं सापेक्ष पथ को एक छोटी फ़ाइल में मुद्रित कर रहा हूं और बाद में फ़ाइल को प्रतिलिपि बनाने के लिए इस प्रविष्टि का उपयोग कर रहा हूं। हालांकि, APP_SERVICE फ़ोल्डर कभी-कभी मौजूद नहीं हो सकता है और असफल होने के लिए इस सापेक्ष पथ का उपयोग करके प्रतिलिपि बना सकता है। – qwarentine

उत्तर

26

readlink -f /home/stevin/data/APP_SERVICE/../datafile.txt क्या आप के लिए देख रहे माना आपके यूनिक्स/लिनक्स readlink है क्या करना चाहिए।

+0

क्षमा करें, मेरे पास readLink नहीं है। मैं लिनक्स 2.6.18-194.el5 – qwarentine

+2

पर वितरण क्या कर रहा हूं? 'रीडलिंक' आमतौर पर 'कोरुटिल्स 'पैकेज का हिस्सा होता है, जिसे आम तौर पर डिफ़ॉल्ट रूप से स्थापित किया जाता है। ध्यान दें कि यह सभी लोअरकेस है, हालांकि, 'readLink' नहीं, लेकिन' readlink' ... – twalberg

18

कुछ इस तरह निर्देशिकाओं के लिए मदद कर सकते हैं: (फ़ाइलों के लिए, basename साथ संलग्न)

echo $(cd ../dir1/dir2/; pwd) 

फ़ाइलों के लिए,

filepath=../dir1/dir2/file3 
echo $(cd $(dirname $filepath); pwd)/$(basename $filepath) 
+0

+1 वास्तव में 'echo "$ (cd $ (dirname $ thingie); pwd)/$ (बेसनाम $ thingie)" 'चाल है दोनों फाइल _and_ निर्देशिकाओं के लिए, क्योंकि 'dirname' और' basename' केवल तारों को संसाधित करते हैं और इस पर ध्यान नहीं देते कि वे जिस स्ट्रिंग पर काम करते हैं वह वास्तविक एफएस ऑब्जेक्ट –

+0

@TobiasKienzler ओह, हां, वास्तव में यह एक टाइपो था, मैंने नहीं किया ' अब तक देखें, एक बार में '../ dir1/dir2/file3' और' $ t' दोनों को रखने के लिए। मैं इसे ठीक कर दूंगा। :) – SuperSaiyan

+0

चूंकि ओपी ने 'रीडलिंक' भी नहीं बताया है, [यहां] (http://stackoverflow.com/a/20198034/321973) एक समाधान है जिसे 'dirname' और' बेसनाम 'की भी आवश्यकता नहीं है ... –

0

Thrustmaster's answer पर लेकिन शुद्ध बैश के साथ आधार पर:

THING="/home/stevin/data/APP_SERVICE/../datafile.txt" 
echo "$(cd ${THING%/*}; pwd)/${THING##*/}" 

बेशक cd के लिए पथ की आवश्यकता है ctually मौजूद है, जो हमेशा मामला नहीं हो सकता है - उस स्थिति में, आपके पास शायद एक छोटी पायथन लिपि लिखकर एक सरल जीवन होगा ...

11

मुझे आश्चर्य है कि कोई भी realpath का उल्लेख नहीं करता है। realpath पर अपने पथ पास करें और यह उन्हें canonicalize करेगा।

$ ls 
Changes 
dist.ini 

$ ls | xargs realpath 
/home/steven/repos/perl-Alt-Module-Path-SHARYANTO/Changes 
/home/steven/repos/perl-Alt-Module-Path-SHARYANTO/dist.ini 
+0

क्या आपके सिस्टम पर डिफ़ॉल्ट रूप से 'realpath' स्थापित है? –

+0

यह स्पष्ट नहीं है कि "यूनिक्स में अंतर्निहित टूल" का अर्थ है (ओपी का मतलब आंतरिक खोल कमांड हो सकता है)। यहां तक ​​कि "डिफ़ॉल्ट रूप से स्थापित" भी अस्पष्ट है क्योंकि ओएस इंस्टॉलर आमतौर पर उपयोगकर्ता को यह चुनने की अनुमति देते हैं कि कौन से घटक इंस्टॉल करना है। 'रीयलपाथ' के लिए, यह डेबियन/उबंटू के साथ आता है और यह सिर्फ एक उपयुक्त/योग्यता दूर है। लेकिन वैसे भी, ओपी भी "किसी भी अच्छे विचार" के बारे में पूछता है। –

+0

मेरे सिस्टम पर, मुझे '-f' विकल्प जोड़ने की आवश्यकता है। –