【问题标题】:How to delete a symbolic link in python?如何删除python中的符号链接?
【发布时间】:2012-07-26 21:13:07
【问题描述】:

我一直在尝试删除我的工作目录中的一些符号链接,但我遇到了一些问题。

os.remove 也会删除链接原文件夹的实际内容

os.shutil 在符号链接的情况下抛出错误。

有没有办法在不破坏原始内容的情况下使用 python 命令删除符号链接?

谢谢

【问题讨论】:

  • 奇怪,os.remove() 并没有为我删除原始文件,只删除了符号链接(尝试使用 Python 2.7.2 和 3.1.4)。
  • 它不会在我的系统中删除原始文件(Python 2.7.1)
  • Smth 值得一看的符号链接:stackoverflow.com/a/12678252/110118(注意:shutil.rmtree 将无法删除链接,尽管 os.path.osdir() 说路径与目录有关)
  • 问题是关于目录的链接,而不是文件的链接。删除目录链接对我也不起作用。 Python 2.6
  • 什么是os.shutil

标签: python symlink


【解决方案1】:

os.unlink() 为我工作。它删除符号链接而不删除它链接到的目录。

【讨论】:

  • Python 2.7 文档中提到了取消链接:This is the same function as remove();,它是如何解决问题的?
  • 此解决方案不适用于 Windows 上通过 mklink /D 创建的目录链接。如果这是您的问题,请参阅下面的答案。
  • 它如何递归地作用于目录中的所有符号链接?
【解决方案2】:

接受的答案不适用于通过mklink /D 创建的链接的 Windows。如果这是您的问题,答案已发布在此问题中:Delete Symlink to directory on Windows

以下代码应该适用于两个系统:

if(os.path.isdir(targetLink)):
    os.rmdir(targetLink)
else:
    os.unlink(targetLink)

【讨论】:

    【解决方案3】:

    对不起,我的错误,我犯了一个愚蠢的编程错误:我愚蠢地删除了源代码而不是链接。

    正确答案是@samfrances。

    os.unlink 可以解决问题。

    除此之外,如果您想使用 python 清除目录,这里还有一些其他提示:

    绝对不是线程安全的,但你明白了......

    def rm(obj):
    
        if os.path.exists(obj):
            if os.path.isdir(obj):
                if os.path.islink(obj):
                     os.unlink(obj)
                else:
                    shutil.rmtree(obj)
            else:
                if os.path.islink(obj):
                    os.unlink(obj)
                else:
                    os.remove(obj)
    

    【讨论】:

    • if os.path.exists(obj) 然后if os.path.islink 然后if os.path.isdir。这样你就不需要 os.unlink 两次。
    【解决方案4】:

    如果目录名包含尾部斜杠,linux rm 命令将跟随链接并尝试删除该目录。见Remove a symlink to a directoryos.remove documentation 表示,如果您尝试删除目录,它会给您一个 OSError,但在符号链接的情况下可能并不总是这样。

    【讨论】:

    • 它对我来说是OSError: [Errno 1] Operation not permitted: 'test/'。可能它依赖于实现。
    • 我手边没有python。我应该说这是一个猜测。我已经编辑了答案。
    • @JohnWatts 您的回答是正确的,但这仅适用于外壳创建的符号链接。 os.symlink 创建的符号链接仍然会出现同样的问题
    • @all: 编辑:: 对不起...我的错...我犯了一个愚蠢的编程错误...愚蠢地删除了源代码而不是链接... gahhh...浪费了差不多一天了...
    【解决方案5】:

    在 Python 3.4 及更高版本中, 如果链接是文件,请使用unlink()

    >>> from pathlib import Path
    >>> p = Path('/some/file/')
    >>> p.unlink()
    

    如果路径指向一个目录,请改用 Path.rmdir()。

    >>> from pathlib import Path
    >>> p = Path('/some/dir/')
    >>> p.rmdir()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-19
      • 2020-11-10
      • 2018-12-01
      • 2010-09-17
      • 1970-01-01
      • 2012-08-28
      • 2012-09-22
      相关资源
      最近更新 更多