2012-06-17 13 views
60

W pythonie, czy istnieje funkcja sprawdzająca, czy dany plik/katalog jest dowiązaniem symbolicznym? Na przykład dla poniższych plików moja funkcja opakowania powinna zwrócić True.Sprawdź, czy plik jest dowiązaniem symbolicznym w pythonie

# 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

Faktycznie, skopiowanie i wklejenie tego pytania w Google daje teraz to pytanie. – porgarmingduod

Odpowiedz

96

Aby ustalić, czy pozycja katalogu jest wykorzystanie dowiązanie w ten sposób:

os.path.islink(path)

zwraca True jeżeli ścieżka odnosi się do wpisu w katalogu, który jest symbolicznym łącza. Zawsze Fałsz, jeśli dowiązania symboliczne nie są obsługiwane.

Na przykład, biorąc pod uwagę:

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

W systemie Windows skróty _ pojawiają się jako pliki z rozszerzeniem 'lnk' i' os.islink ('a_shortcut.lnk') 'zwraca' False'. –

+1

@EvgeniSergeev To dlatego, że są to po prostu pliki - prawdopodobnie kac z systemu Windows 9x, kiedy jedynym systemem plików był FAT/FAT32. Zobacz ten http://superuser.com/questions/347930/what-are-the-various-link-types-in-windows-how-do-i-create-them dla wszystkich typów symbolicznych/twardych linków i katalogów skrzyżowania obsługiwane w NTFS. Mimo to nadal nie uważam, że Python je obsługuje. – jmc

+7

Funkcja islink() nie działa w przypadku dowiązań symbolicznych systemu Windows, to znaczy skrzyżowań. Tak więc odpowiedź dotyczy tylko systemu Unix. –

5

dla Pythona 3.4 i up, można użyć klasy Path

from pathlib import Path 


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

Trzeba być ostrożnym przy korzystaniu z is_symlink metoda(). Zwróci wartość True, nawet cel łącza nie istnieje, o ile nazwa obiektu jest dowiązaniem symbolicznym. Na przykład (Linux/Unix):

ln -s ../nonexistentfile flnk 

Następnie, w bieżącym katalogu odpalić pyton

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

Programista musi zdecydować, co on/ona naprawdę chce. Python 3 zmienił nazwę na wiele klas. Warto przeczytać stronę podręcznika dla klasy Path: https://docs.python.org/3/library/pathlib.html

+0

to może tylko znaleźć poprawne dowiązanie symboliczne, to może nie zidentyfikować pliku, który jest dowiązaniem symbolicznym, ale jest uszkodzony. więc jeśli filtrujesz prawdziwe pliki lub wszystkie dowiązania symboliczne (dobre i złe), upewnij się, że wykonujesz dodatkowe sprawdzenia. – 2114L3

+0

@ 2114L3 Co oznacza poprawne, ale zepsute dowiązanie symboliczne? Od prostego testowania z uszkodzonym dowiązaniem symbolicznym wydaje się, że 'is_symlink()' ma wartość true, a 'exists()' ma wartość false, co jest tym, czego oczekiwałbym. Czy możesz podać źródło swoich obaw? – Sheljohn

1

Bez zamiaru rozwalenia tego tematu, ale zostałem przekierowany na tę stronę, ponieważ szukałem dowiązania symbolicznego, aby je znaleźć i przekonwertować je na prawdziwe pliki i znalazłem ten skrypt w bibliotece narzędzi Pythona.

#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") 
Powiązane problemy