चेक करें कि क्या फाइल अजगर में सिमिलिंक है


91

अजगर में, क्या यह जांचने के लिए एक फ़ंक्शन है कि क्या दी गई फ़ाइल / निर्देशिका एक सिमलिंक है? उदाहरण के लिए, नीचे दी गई फ़ाइलों के लिए, मेरा आवरण फ़ंक्शन वापस आ जाना चाहिए 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

जवाबों:


136

यह निर्धारित करने के लिए कि क्या एक निर्देशिका प्रविष्टि एक सिमिलिंक है इसका उपयोग करें:

os.path.islink (पथ)

यदि पथ एक निर्देशिका प्रविष्टि जो एक प्रतीकात्मक लिंक है को संदर्भित करता है तो सही लौटें। यदि प्रतीक लिंक का समर्थन नहीं करते हैं तो हमेशा गलत।

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

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

7
विंडोज पर, शॉर्टकट एक्सटेंशन के साथ फाइल के रूप में दिखाई देते हैं lnk, और os.islink('a_shortcut.lnk')रिटर्न करते हैं False
एवगेनी सर्गेव

1
@EvgeniSergeev ऐसा इसलिए है क्योंकि वे सिर्फ फाइलें हैं - संभवतः विंडोज 9x दिनों से एक हैंगओवर जब एकमात्र फ़ाइल सिस्टम FAT / FAT32 था। NTFS पर समर्थित प्रतीकात्मक / हार्ड लिंक और निर्देशिका जंक्शनों के सभी प्रकारों के लिए यह सुपरयूज़र .com/questions/347930/… देखें । उस ने कहा, मुझे अभी भी नहीं लगता कि पायथन उनका समर्थन करता है।
jmc 21

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

2
यदि आपको Windows समाधान की आवश्यकता है, तो कृपया इस stackoverflow.com/questions/27972776/… का उत्तर दें।
द गॉडफादर

1
@ TheGodfather: डायरेक्टरी जंक्शन कोई सिम्लिंक ( IO_REPARSE_TAG_SYMLINK) नहीं है।
jfs

11

अजगर 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/pll.html.html


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

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

1
@ शैलजोन ने इस उत्तर पर संपादन की जाँच की, इससे पहले कि मेरी टिप्पणी मौजूद हो () उत्तर का हिस्सा नहीं था। मौजूद का उपयोग करना एक अतिरिक्त जांच है जिसका मैं मतलब था। मूल संस्करण के अनुसार is_symlink का उपयोग करना पर्याप्त नहीं है।
2114L3

विंडोज पर यह मेरे लिए सही तरीके से काम नहीं कर रहा है: is_symlinkबिना trueकिसी फाइल के वापस आ रहा है (इसलिए exists()भी रिटर्न true)।
जेम्स हिर्सचोर्न

3

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

#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")
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.