web-dev-qa-db-fra.com

Vérifiez si le fichier est un lien symbolique dans python

En python, existe-t-il une fonction permettant de vérifier si un fichier/répertoire donné est un lien symbolique? Par exemple, pour les fichiers ci-dessous, ma fonction wrapper devrait renvoyer 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
78
Bandicoot

Pour déterminer si une entrée de répertoire est un lien symbolique, utilisez ceci:

os.path.islink (path)

Renvoie True si path fait référence à une entrée de répertoire qui est un lien symbolique. Toujours False si les liens symboliques ne sont pas pris en charge.

Par exemple, étant donné:

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
118
Levon

Pour python 3.4 et supérieur, vous pouvez utiliser la classe Path

from pathlib import Path


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

Vous devez faire attention lorsque vous utilisez la méthode is_symlink (). Il retournera True même si la cible du lien est inexistante tant que l'objet nommé est un lien symbolique. Par exemple (Linux/Unix):

ln -s ../nonexistentfile flnk

Ensuite, dans votre répertoire actuel, lancez python

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

Le programmeur doit décider ce qu'il/elle veut vraiment. Python 3 semble avoir renommé de nombreuses classes. Il serait peut-être intéressant de lire la page de manuel relative à la classe Path: https://docs.python.org/3/ bibliothèque/pathlib.html

9
Kemin Zhou

Sans intention de gonfler ce sujet, mais j'ai été redirigé vers cette page car je cherchais des liens symboliques pour les trouver et les convertir en fichiers réels. Ce script a été trouvé dans la bibliothèque d'outils python.

#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")
3
user1767754