作業ディレクトリのシンボリックリンクをいくつか削除しようとしていますが、いくつかの問題に直面しています。
os.remove
は、リンクの元のフォルダの実際のコンテンツも削除します
os.shutil
は、シンボリックリンクの場合にエラーをスローします。
元のコンテンツを破壊せずにpythonコマンドを使用してシンボリックリンクを削除する方法はありますか?
ありがとう
os.unlink()
機能します。リンク先のディレクトリは削除せずにシンボリックリンクを削除します。
受け入れられた回答は、mklink /D
を介して作成されたリンクを持つWindowsでは機能しません。それがあなたの問題であれば、この質問に答えが投稿されています: Windows上のディレクトリへのシンボリックリンクを削除
次のコードは両方のシステムで動作するはずです。
if(os.path.isdir(targetLink)):
os.rmdir(targetLink)
else:
os.unlink(targetLink)
ディレクトリ名に末尾のスラッシュが含まれている場合、linux rm
コマンドはリンクをたどり、ディレクトリを削除しようとします。 ディレクトリへのシンボリックリンクを削除する を参照してください。 os.remove
documentation は、ディレクトリを削除しようとした場合にOSError
が得られることを示していますが、シンボリックリンクの場合は常にそうとは限りません。
申し訳ありませんが、私の悪い、私は愚かなプログラミングの間違いをしました:リンクの代わりにソースを愚かに削除していました。
正解は@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)
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()