2012-06-17 22 views
60

में सिमलिंक है या नहीं, यह जांचने के लिए कोई फ़ंक्शन है कि कोई दी गई फ़ाइल/निर्देशिका एक सिम्लिंक है या नहीं? उदाहरण के लिए, नीचे दी गई फ़ाइलों के लिए, मेरे रैपर फ़ंक्शन को True वापस करना चाहिए।जांचें कि फ़ाइल पाइथन

# ls -l 
total 0 
lrwxrwxrwx 1 root root 8 2012-06-16 18:58 dir -> ../temp/ 
lrwxrwxrwx 1 root root 6 2012-06-16 18:55 link -> ../log 
+6

वास्तव में, Google में उस प्रश्न की प्रतिलिपि बनाना और चिपकाना अब इस प्रश्न को उत्पन्न करता है। – porgarmingduod

उत्तर

96

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

os.path.islink(path)

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

उदाहरण के लिए, दिए गए:

drwxr-xr-x 2 root root 4096 2011-11-10 08:14 bin/ 
drwxrwxrwx 1 root root 57 2011-07-10 05:11 initrd.img -> boot/initrd.img-2.. 

>>> import os.path 
>>> os.path.islink('initrd.img') 
True 
>>> os.path.islink('bin') 
False 
+4

विंडोज़ पर, _Shortcuts_ एक्सटेंशन 'lnk' के साथ फ़ाइलों के रूप में दिखाई देता है, और' os.islink ('a_shortcut.lnk') 'रिटर्न' झूठा होता है। –

+1

@EvgeniSergeev ऐसा इसलिए है क्योंकि वे केवल फाइलें हैं - संभवतः विंडोज 9एक्स दिनों से एक हैंगओवर जब एकमात्र फाइल सिस्टम एफएटी/एफएटी 32 था। यह http://superuser.com/questions/347930/what-are-the-various-link-types-in-windows-how-do-i-create-them सभी प्रकार के प्रतीकात्मक/हार्ड लिंक और निर्देशिका के लिए देखें NTFS पर समर्थित जंक्शन। उस ने कहा, मुझे अभी भी नहीं लगता कि पाइथन उनका समर्थन करता है। – jmc

+7

और islink() विंडोज सिम्लिंक के लिए काम नहीं करता है, यानी जंक्शन। तो जवाब केवल यूनिक्स के लिए लागू है। –

5

अजगर 3.4 के लिए और ऊपर, आप पथ वर्ग

from pathlib import Path 


# rpd is a symbolic link 
>>> Path('rdp').is_symlink() 
True 
>>> Path('README').is_symlink() 
False 

उपयोग कर सकते हैं आप जब is_symlink() विधि का उपयोग कर सावधान रहना होगा। यह ट्रू वापस आ जाएगा, यहां तक ​​कि लिंक का लक्ष्य तब तक मौजूद नहीं है जब तक नामित ऑब्जेक्ट एक सिम्लिंक है। उदाहरण (लिनक्स/यूनिक्स) के लिए:

ln -s ../nonexistentfile flnk 

फिर, अपने वर्तमान निर्देशिका में अजगर ऊपर आग

>>> from pathlib import Path 
>>> Path('flnk').is_symlink() 
True 
>>> Path('flnk').exists() 
False 

प्रोग्रामर तय करने के लिए क्या वह/वह वास्तव में चाहता है। ऐसा लगता है कि पाइथन 3 ने कई वर्गों का नाम बदल दिया है। पथ वर्ग के लिए मैन्युअल पृष्ठ को पढ़ने के लिए उपयुक्त हो सकता है: https://docs.python.org/3/library/pathlib.html

+0

यह मई केवल वैध सिम्लिंक पाता है, यह एक फ़ाइल की पहचान नहीं कर सकता है जो सिमलिंक है लेकिन टूटा हुआ है। इसलिए यदि आप वास्तविक फ़ाइलों या सभी सिम्लिंक (अच्छे और बुरे) के लिए फ़िल्टर कर रहे हैं तो सुनिश्चित करें कि आप अतिरिक्त चेक – 2114L3

+0

@ 2114L3 मान्य लेकिन टूटा सिमलिंक का क्या अर्थ है? एक टूटी हुई सिम्लिंक के साथ सरल परीक्षण से, ऐसा लगता है कि 'is_symlink() 'सत्य है, और' मौजूद है() 'झूठा है, जो मैं अपेक्षा करता हूं। क्या आप अपनी चिंताओं के लिए स्रोत दे सकते हैं? – Sheljohn

1

इस विषय को फटकारने के इरादे के बिना, लेकिन मुझे इस पृष्ठ पर रीडायरेक्ट किया गया था क्योंकि मैं उन्हें ढूंढने और उन्हें वास्तविक फ़ाइलों में बदलने के लिए सिम्लिंक की तलाश में था और पाइथन टूल लाइब्रेरी के भीतर इस स्क्रिप्ट को मिला।

#Source https://github.com/python/cpython/blob/master/Tools/scripts/mkreal.py 


import sys 
import os 
from stat import * 

BUFSIZE = 32*1024 

def mkrealfile(name): 
    st = os.stat(name) # Get the mode 
    mode = S_IMODE(st[ST_MODE]) 
    linkto = os.readlink(name) # Make sure again it's a symlink 
    f_in = open(name, 'r') # This ensures it's a file 
    os.unlink(name) 
    f_out = open(name, 'w') 
    while 1: 
     buf = f_in.read(BUFSIZE) 
     if not buf: break 
     f_out.write(buf) 
    del f_out # Flush data to disk before changing mode 
    os.chmod(name, mode) 

    mkrealfile("/Users/test/mysymlink") 
संबंधित मुद्दे