2011-11-28 2 views

답변

6

이 질문을 최근에 조사한 결과, 가장 좋은 방법은 실제로 unlink이고 그 다음은 symlink입니다. 당신이 자동 교체와 함께 예를 들어, 깨진 링크를 해결하기 위해 단지 필요한 경우에, 당신은 os.readlink을 수행 할 수 있습니다

for f in os.listdir(dir): 
    path = os.path.join(dir, f) 
    old_link = os.readlink(path) 
    new_link = old_link.replace(before, after) 
    os.unlink(path) 
    os.symlink(new_link, path) 
15

이 때문에 기존 파일의 실패 할 경우 심볼릭 링크와 시도 약간의 기능, 그것을 제거 다시 연결됩니다.

import os, errno 

def symlink_force(target, link_name): 
    try: 
     os.symlink(target, link_name) 
    except OSError, e: 
     if e.errno == errno.EEXIST: 
      os.remove(link_name) 
      os.symlink(target, link_name) 
     else: 
      raise e 
12

원자 수정이 필요한 경우 링크 해제가 작동하지 않습니다.

더 나은 솔루션은 새 임시 심볼릭 링크를 만든 다음에 그것을 이름을 변경하는 것이 하나의 기존 :

당신은 할 확인할 수 있습니다

확실히 올바르게 너무 업데이트 된

os.symlink(target, tmpLink) 
os.rename(tmpLink, linkName) 
:

if os.path.realpath(linkName) == target: 
    # Symlink was updated 

os.rename에 대한 설명서에 따르면 Windows에서 심볼 링크를 원자 적으로 변경할 수있는 방법이 없을 수 있습니다. 이 경우 삭제하고 다시 만듭니다.

+4

파이썬 3.3이를'os.replace' POSIX 및 Windows 시스템에서 동일한 동작을 제공하기 위해'os.rename' 대신 사용할 수 있습니다. – Tom

0

e.errno는 = errno.EEXIST 그런 다음 오류 숨기려하지 않을 때 경우에 인상 명령을 추가하는 것을 잊지 마십시오!

if e.errno == errno.EEXIST: 
    os.remove(link_name) 
    os.symlink(target, link_name) 
else: 
    raise