2009-08-06 8 views
43

मेरे पास एक स्ट्रिंग है जिसमें मौजूदा सिम्लिंक के लिए फ़ाइल सिस्टम पथ है। मैं पथ प्राप्त करना चाहता हूं कि यह लिंक इंगित करता है।मैं सिम्लिंक का लक्ष्य कैसे प्राप्त करूं?

मूल रूप से मैं एक ही है कि मैं hackery के इस बिट के माध्यम से प्राप्त होता हैं:

s = "path/to/existing/symlink" 
`ls -ld #{s}`.scan(/-> (.+)/).flatten.last 

लेकिन मैं बाहर बमबारी के बिना यह करना चाहते हैं।

File.readlink("path/to/symlink") 
+0

संयोग से, बैश में यह 'रीडलिंक पथ/से/सिम्लिंक' भी है। 'Ls' के आउटपुट को कभी भी पार्स न करें। – OrangeDog

उत्तर

60

मुझे लगता है कि readlink आप के लिए क्या देख रहे है

File.realpath("symlink_path") 

कौन सा दोनों सिमलिंक लिए काम करता है और सामान्य फाइलें।

+13

ध्यान दें कि यदि सिम्लिंक रिश्तेदार है या सिम्लिंक की एक श्रृंखला है, तो यह सभी लिंक का पालन नहीं करेगा या पूरा पथ वापस नहीं करेगा- पथनाम # realpath होगा। – mfazekas

+0

@mfazekas, इसे इंगित करने के लिए धन्यवाद; मुझे आश्चर्य है कि क्या वास्तव में ओपी चाहता था; 'ls -ld ... 'असली पथ भी नहीं देता है। – Inshallah

43
require 'pathname' 
Pathname.new("symlink").realpath 

या readlink के रूप में अन्य लोगों ने कहा

+3

बल्कि Pathname.new ("/ path/to/symlink") realpath.to_s :) .. यह सिस्टम() –

10

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

+0

का उपयोग करने से निश्चित रूप से बेहतर है यदि आप चाहते हैं कि 'readpath' पर चिपकने की आवश्यकता है 1.8.7 संगतता – nhed