Necesito procesar la salida de cierto programa en Python. La salida de ese programa contiene varios enlaces simbólicos que apuntan a sí mismos, lo que puede ser una molestia para trabajar.

Quiero detectar, de una lista de archivos, cuáles son enlaces simbólicos que apuntan a sí mismos para poder eliminarlos.

0
user2891462 2 mar. 2018 a las 12:06

3 respuestas

La mejor respuesta

Esto parece detectar correctamente enlaces simbólicos recursivos en target_dir:

import os

target_dir = os.getcwd()
all_files = [os.path.realpath(os.path.join(target_dir, f))
             for f in os.listdir(target_dir)]

for f in all_files:
    if os.path.islink(f) and os.path.realpath(os.readlink(f)) == f:
        print('%s is a recursive symlink' % f)
0
user2891462 2 mar. 2018 a las 09:59

Crea una lista y guarda en ella rutas de archivos interesantes. Si no los conoce, quizás compare la lista de archivos en ubicaciones específicas antes y después de ejecutar el programa. Puede leer archivos de esa lista en un bucle y verificar si algunos de ellos contienen la ruta de la lista. Podría ocurrir un problema con la lectura de enlaces simbólicos, ya que contienen elementos internos de lo que señalan. Hay una función os.readlink () que lee el enlace simbólico de sí mismo. El enlace simbólico contiene la ruta para archivarlo.

0
pomaranga 2 mar. 2018 a las 09:30

Puede usar find + awk para hacer el trabajo.

Use find para enumerar todos los enlaces simbólicos:

$ find . -type l -ls
1197707      0 lrwxrwxrwx   1 user  user         9 Mar  2 17:22 ./subdir/testlink2 -> testlink2
1183041      0 lrwxrwxrwx   1 user  user         8 Mar  2 17:20 ./testlink -> testlink

Si solo desea enumerar enlaces simbólicos del directorio actual, aplique un argumento -maxdepth:

$ find . -maxdepth 1 -type l -ls

Después de enumerar todos los enlaces simbólicos, use awk para encontrar los que apuntan a sí mismos:

$ find . -type l -ls | awk '{ n=split($11, a, "/"); if (a[n] == $13) { print $11 } }'
./subdir/testlink2
./testlink

Aquí estoy usando algunos argumentos posicionales, pero no deberían ser difíciles de entender.

0
Yuankun 2 mar. 2018 a las 09:47