Saltar al contenido

Compruebe si el archivo es un enlace simbólico en Python

Solución:

Para determinar si una entrada de directorio es un enlace simbólico, use esto:

os.path.islink (ruta)

Devuelve True si la ruta se refiere a una entrada de directorio que es un enlace simbólico. Siempre falso si no se admiten enlaces simbólicos.

Por ejemplo, dado:

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

Para Python 3.4 y versiones posteriores, puede usar la clase Path

from pathlib import Path


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

Debe tener cuidado al usar el método is_symlink (). Devolverá True incluso si el destino del enlace no existe siempre que el objeto nombrado sea un enlace simbólico. Por ejemplo (Linux / Unix):

ln -s ../nonexistentfile flnk

Luego, en su directorio actual, inicie Python

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

El programador tiene que decidir lo que realmente quiere. Python 3 parece haber cambiado el nombre de muchas clases. Puede que valga la pena leer la página del manual de la clase Path: https://docs.python.org/3/library/pathlib.html

Sin la intención de inflar este tema, pero fui redirigido a esta página porque estaba buscando enlaces simbólicos para encontrarlos y convertirlos en archivos reales y encontré este script dentro de la biblioteca de herramientas de 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")
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *