Мне нужно обработать вывод определенной программы на Python. Вывод этой программы содержит несколько символических ссылок, которые указывают на себя, с которыми может быть трудно работать.

Я хочу определить из списка файлов, какие из них являются символическими ссылками, указывающими на себя, чтобы я мог их удалить.

0
user2891462 2 Мар 2018 в 12:06

3 ответа

Лучший ответ

Кажется, это правильно обнаруживает рекурсивные символические ссылки в 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 Мар 2018 в 09:59

Создайте список и сохраните в нем пути интересных файлов. Если вы их не знаете, возможно, сравните список файлов в определенных местах до и после запуска программы. Вы можете прочитать файлы из этого списка в цикле и проверить, содержат ли некоторые из них путь из списка. Проблема может возникнуть при чтении символических ссылок, поскольку они содержат внутреннюю часть того, на что они указывают. Существует функция os.readlink (), которая читает символическую ссылку сама по себе. Сама ссылка содержит путь к файлу, на который она указывает.

0
pomaranga 2 Мар 2018 в 09:30

Вы можете использовать find + awk для выполнения работы.

Используйте find для отображения всех символических ссылок:

$ 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

Если вы хотите отобразить только символические ссылки в текущем каталоге, примените аргумент -maxdepth:

$ find . -maxdepth 1 -type l -ls

После перечисления всех символических ссылок используйте awk, чтобы найти ссылки, указывающие на себя:

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

Здесь я использую некоторые позиционные аргументы, но их не должно быть трудно понять.

0
Yuankun 2 Мар 2018 в 09:47