列出所有指向自己的符号链接

List all symbolic links to themselves

我需要处理Python中某个程序的输出。该程序的输出包含几个指向自身的符号链接,使用起来可能很痛苦。

我想从文件列表中检测哪些文件是指向自身的符号链接,以便我可以删除它们。

创建一个列表并将感兴趣文件的路径保存到其中。 如果您不知道它们,可以比较 运行 程序前后特定位置的文件列表。 您可以循环读取该列表中的文件,并检查其中是否包含列表中的路径。 读取符号链接可能会出现问题,因为它们包含所指向内容的内部。有一个 os.readlink() 函数可以读取自身的符号链接。符号链接本身包含它指向的文件路径。

您可以使用 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(, a, "/"); if (a[n] == ) { print  } }'
./subdir/testlink2
./testlink

这里我使用了一些位置参数,但它们应该不难理解。

这似乎可以正确检测 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)