如何在Python中删除符号链接?

39

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

os.remove 还会删除链接原始目录的实际内容。

os.shutil 在处理符号链接时会报错。

是否有办法使用Python命令删除符号链接而不破坏原始内容?

谢谢


8
奇怪,os.remove() 对我来说没有删除原始文件,只删除了符号链接(使用 Python 2.7.2 和 3.1.4 进行了尝试)。 - Frédéric Hamidi
1
它不会删除原始文件,也不会在我的系统上删除(Python 2.7.1) - KARASZI István
有关符号链接的值得一看的内容:https://dev59.com/wGnWa4cB1Zd3GeqPwhLn#12678252 (注意:shutil.rmtree将无法删除链接,尽管os.path.osdir()表示路径属于目录) - mlvljr
问题是关于目录链接,而不是文件链接。删除目录链接对我也没有用。Python 2.6 - MOnsDaR
os.shutil是什么? - cowlinator
@MOnsDaR,删除目录链接对我有效。Python 2.7.5,CentOS 7。 - Change-the-world
5个回答

55

os.unlink() 对我来说很有效。它可以删除符号链接而不会删除链接到的目录。


18
Python 2.7文档中关于unlink的说法是:“这个函数与remove()相同”,它是如何解决问题的? 翻译:Python 2.7文档中关于unlink的说明是:“这个函数与remove()相同”,它是通过调用remove()函数来解决问题的。 - Amir Ali Akbari
如果是通过 mklink /D 创建的目录链接,在 Windows 上此解决方案无效。如果您遇到这个问题,请参见下面的答案。 - MOnsDaR
如何递归地处理目录中的所有符号链接? - Jürgen K.

11

如果你在Windows系统中通过mklink /D创建了链接,则已接受的答案无法正常工作。如果这是你的问题,答案已经在这个问题中发布:Delete Symlink to directory on Windows

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

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

6

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

正确的答案是由@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)

如果 os.path.exists(obj) 成立,那么再判断 os.path.islink 是否成立,最后再判断 os.path.isdir。这样就不需要两次使用 os.unlink 了。 - QxQ

3
在Python 3.4及以上版本中,如果link是一个文件,则使用unlink()函数。
>>> from pathlib import Path
>>> p = Path('/some/file/')
>>> p.unlink()

如果路径指向一个目录,请使用Path.rmdir()。
>>> from pathlib import Path
>>> p = Path('/some/dir/')
>>> p.rmdir()

2
如果目录名以斜杠结尾,Linux的rm命令将跟随链接并尝试删除该目录。请参见删除符号链接到目录os.remove文档说,如果您尝试删除一个目录,则会给出OSError,但在符号链接的情况下可能不总是发生这种情况。

1
它对我说:“OSError: [Errno 1] Operation not permitted: 'test/'”。可能是实现相关的。 - KARASZI István
1
我手头没有Python。我应该说这只是一个猜测。我已经编辑了答案。 - John Watts
@JohnWatts 您的答案是正确的,但这仅适用于由 shell 创建的符号链接。使用 os.symlink 创建的符号链接仍然存在相同的问题。 - akshayc11
1
@所有人:编辑:: 对不起...我的错...我犯了一个愚蠢的编程错误...我愚蠢地删除了源而不是链接...呃...浪费了将近一天的时间在这上面... - akshayc11

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接