代码之家  ›  专栏  ›  技术社区  ›  user2891462

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

  •  0
  • user2891462  · 技术社区  · 8 年前

    我需要用Python处理某个程序的输出。该程序的输出包含几个指向自身的符号链接,这可能是一个很难处理的问题。

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

    3 回复  |  直到 8 年前
        1
  •  0
  •   pomaranga    8 年前

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

        2
  •  0
  •   Yuankun    8 年前

    您可以使用 find + awk 做这项工作。

    使用 发现 要列出所有符号链接,请执行以下操作:

    $ 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
    

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

        3
  •  0
  •   user2891462    8 年前

    这似乎可以正确检测中的递归符号链接 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)
    
    推荐文章