2015-10-20 13 views
5

पायथन का उपयोग करके, मुझे यह जांचना होगा कि सैकड़ों सिम्लिंक सही हैं या नहीं, जब उन्हें नहीं बनाया जाए। अब मैं जो चाहता हूं उसके वास्तविक पथों की तुलना करना और मेरे पास क्या है, लेकिन यह धीमा है क्योंकि यह ऑटोफ़ाउंट के साथ एनएफएस पर है।पायथन में सिम्लिंक लक्ष्य कैसे प्राप्त करें?

अन्यथा मैं 'ls -l' कमांड के साथ एक उपप्रोसेसर चलाने जा रहा हूं और लौटे तारों की सूची पर काम करता हूं। मैं एक बेहतर समाधान पसंद करेंगे ... एक अजगर लाइब्रेरी का उपयोग कर,

Edit1: मेरे पास है: link_name -> link_target और फिर link_target -> a_real_file। मुझे link_name से से link_target निकालने की आवश्यकता है। मुझे परवाह नहीं है कि असली फाइल मौजूद नहीं है।

संपादित 2: शायद मैंने सही ढंग से व्यक्त नहीं किया। एक सही सिम्लिंक द्वारा मेरा मतलब है 'एक लिंक जो एक पूर्वनिर्धारित पथ को इंगित करता है, भले ही यह' मौजूद न हो। इसलिए मुझे यह जांचना होगा कि:

link_name_1 -> target_1 
link_name_2 -> target_2 

यही कारण है कि मुझे लक्ष्य निकालने की ज़रूरत है, असली पथ नहीं। फिर मैं उन्हें एक संदर्भ (शब्दकोश) से तुलना करता हूं। तो मेरा सवाल है: मैं लक्ष्य पथ कैसे निकालूं?

उत्तर

0

निर्धारित करने के लिए एक निर्देशिका प्रविष्टि एक सिमलिंक उपयोग यह है: अगर पथ एक निर्देशिका प्रविष्टि है कि एक प्रतीकात्मक कड़ी है को संदर्भित करता है

os.path.islink(path)

वापसी सच है। प्रतीकात्मक लिंक समर्थित नहीं हैं तो हमेशा गलत।

-1

यह निर्धारित करने के लिए कि कोई लिंक टूटा हुआ है, आप os.walk और os.path.exists(path) परीक्षण कर सकते हैं जो एक टूटी हुई लिंक के लिए झूठी वापसी करेगा। इसके बाद आप यह पता लगाने के लिए os.path.realpath(path) का उपयोग कर सकते हैं कि लिंक क्या इंगित कर रहा है।
कुछ (untested) की तरह:

for root, dirs, files in os.walk('<path>'): 
    for file in files: 
     f = os.join(root, file) 
     if os.path.islink(f) and not os.path.exist(f): 
      print("Broken: {} -> {}".format(f, os.path.realpath(f))) 
+0

कि os.path.realpath (खबरदार) वर्तमान में Windows पर काम नहीं करता (http://bugs.python.org/ issue9949)। – antred

6

आप os.readlink() को देखने की जरूरत है।

+1

कृपया अपना कोड संपादित करने के बारे में और स्पष्टीकरण जोड़ने के लिए अपनी पोस्ट को संपादित करने पर विचार करें और यह समस्या का समाधान क्यों करेगा। एक उत्तर जिसमें ज्यादातर कोड शामिल होते हैं (भले ही यह काम कर रहा हो) आमतौर पर ओपी को उनकी समस्या को समझने में मदद नहीं करेगा। – SuperBiasedMan

+0

धन्यवाद आर्मीन, यह वही है जो मुझे चाहिए था। मैं लक्ष्य प्राप्त करने में सक्षम हूं और कार्य अब बहुत तेज़ है। – zorggy

5

os.readlink() के साथ समस्या यह केवल लिंक के 1 चरण को हल करेगा। हमारे पास ऐसी स्थिति हो सकती है जहां A अन्य लिंक B से लिंक हो, और B लिंक लटक रहा है।

$ ln -s /tmp/example/notexist /tmp/example/B 
$ ln -s /tmp/example/B /tmp/example/A 
$ ls -l /tmp/example 
A -> /tmp/example/B 
B -> /tmp/example/notexist 

अब अजगर में, os.readlink आप पहली बार लक्ष्य देता है।

>>> import os 
>>> os.readlink('A') 
'/tmp/example/B' 

लेकिन ज्यादातर स्थितियों में मुझे लगता है कि हम हल किए गए रास्ते में रूचि रखते हैं। तो pathlib यहाँ मदद कर सकते हैं:

>>> from pathlib import Path 
>>> Path('A').resolve() 
PosixPath('/tmp/example/notexist') 

बड़े अजगर संस्करणों के लिए:

>>> os.path.realpath('A') 
'/tmp/example/notexist' 
संबंधित मुद्दे