web-dev-qa-db-ja.com

Pythonでシンボリックリンクを削除する方法

作業ディレクトリのシンボリックリンクをいくつか削除しようとしていますが、いくつかの問題に直面しています。

os.removeは、リンクの元のフォルダの実際のコンテンツも削除します

os.shutilは、シンボリックリンクの場合にエラーをスローします。

元のコンテンツを破壊せずにpythonコマンドを使用してシンボリックリンクを削除する方法はありますか?

ありがとう

24
akshayc11

os.unlink() 機能します。リンク先のディレクトリは削除せずにシンボリックリンクを削除します。

27
samfrances

受け入れられた回答は、mklink /Dを介して作成されたリンクを持つWindowsでは機能しません。それがあなたの問題であれば、この質問に答えが投稿されています: Windows上のディレクトリへのシンボリックリンクを削除

次のコードは両方のシステムで動作するはずです。

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

ディレクトリ名に末尾のスラッシュが含まれている場合、linux rmコマンドはリンクをたどり、ディレクトリを削除しようとします。 ディレクトリへのシンボリックリンクを削除する を参照してください。 os.removedocumentation は、ディレクトリを削除しようとした場合にOSErrorが得られることを示していますが、シンボリックリンクの場合は常にそうとは限りません。

2
John Watts

申し訳ありませんが、私の悪い、私は愚かなプログラミングの間違いをしました:リンクの代わりにソースを愚かに削除していました。

正解は@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)
2
akshayc11

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()
1
SuperNova