列出所有符号链接

时间:2018-03-02 09:06:37

标签: python symlink

我需要在Python中处理某个程序的输出。该程序的输出包含几个指向自己的符号链接,这可能很难处理。

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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您可以使用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

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

答案 2 :(得分:0)

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