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
Pour déterminer si une entrée de répertoire est un lien symbolique, utilisez ceci:
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
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
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")