파일이 파이썬에서 심볼릭 링크인지 확인하십시오.


97

파이썬에서 주어진 파일 / 디렉토리가 심볼릭 링크인지 확인하는 기능이 있습니까? 예를 들어 아래 파일의 경우 내 래퍼 함수는 True.

# ls -l
total 0
lrwxrwxrwx 1 root root 8 2012-06-16 18:58 dir -> ../temp/
lrwxrwxrwx 1 root root 6 2012-06-16 18:55 link -> ../log

답변:


141

디렉토리 항목이 심볼릭 링크인지 확인하려면 다음을 사용하십시오.

os.path.islink (경로)

경로가 심볼릭 링크 인 디렉토리 항목을 참조하면 True를 반환합니다. 심볼릭 링크가 지원되지 않으면 항상 False입니다.

예를 들어 다음과 같습니다.

drwxr-xr-x   2 root root  4096 2011-11-10 08:14 bin/
drwxrwxrwx   1 root root    57 2011-07-10 05:11 initrd.img -> boot/initrd.img-2..

>>> import os.path
>>> os.path.islink('initrd.img')
True
>>> os.path.islink('bin')
False

8
Windows에서 바로 가기 는 확장자가 lnk인 파일로 나타나고를 os.islink('a_shortcut.lnk')반환합니다 False.
Evgeni Sergeev

1
@EvgeniSergeev 그것은 단지 파일이기 때문입니다-아마도 유일한 파일 시스템이 FAT / FAT32였던 Windows 9x 시절의 숙취 일 수 있습니다. NTFS에서 지원되는 모든 유형의 심볼릭 / 하드 링크 및 디렉토리 접합에 대해서는이 superuser.com/questions/347930/… 을 참조하십시오 . 즉, 나는 여전히 파이썬이 그들을 지원한다고 생각하지 않습니다.
jmc 2011

10
그리고 islink ()는 Windows 심볼릭 링크, 즉 정션에서는 작동하지 않습니다. 따라서 대답은 Unix에만 적용됩니다.
The Godfather 2015 년

2
Windows 솔루션이 필요한 경우이 stackoverflow.com/questions/27972776/… 답변을 참조하십시오 .
대부

1
@TheGodfather : 디렉토리 접합이 심볼릭 링크가 아닙니다 ( IO_REPARSE_TAG_SYMLINK).
jfs 2016

12

Python 3.4 이상에서는 Path 클래스를 사용할 수 있습니다.

from pathlib import Path


# rpd is a symbolic link
>>> Path('rdp').is_symlink()
True
>>> Path('README').is_symlink()
False

is_symlink () 메서드를 사용할 때는주의해야합니다. 명명 된 개체가 심볼릭 링크 인 한 링크 대상이 존재하지 않더라도 True를 반환합니다. 예 (Linux / Unix) :

ln -s ../nonexistentfile flnk

그런 다음 현재 디렉토리에서 파이썬을 시작하십시오.

>>> from pathlib import Path
>>> Path('flnk').is_symlink()
True
>>> Path('flnk').exists()
False

프로그래머는 자신이 원하는 것을 결정해야합니다. Python 3은 많은 클래스의 이름을 변경 한 것 같습니다. Path 클래스의 매뉴얼 페이지 https://docs.python.org/3/library/pathlib.html 을 읽는 것이 좋습니다.


이것은 유효한 심볼릭 링크 만 찾을 수 있으며 심볼릭 링크이지만 손상된 파일을 식별하지 못할 수도 있습니다. 따라서 실제 파일이나 모든 심볼릭 링크 (양호 및 불량)를 필터링하는 경우 추가 검사를 수행해야합니다.
2114L3

@ 2114L3 유효하지만 깨진 심볼릭 링크는 무엇을 의미합니까? 깨진 심볼릭 링크를 사용한 간단한 테스트에서 그것이 is_symlink()사실이고 exists()거짓 인 것 같습니다 . 우려 사항에 대한 출처를 제공 할 수 있습니까?
Jonathan H

1
@Sheljohn은 내 의견이 존재하기 전에이 답변에 대한 편집 내용을 확인하십시오 ()는 답변의 일부가 아닙니다. 사용하는 것은 내가 의미하는 추가 검사입니다. is_symlink를 단독으로 사용하는 것은 원래 버전에 따라 충분하지 않기 때문입니다.
2114L3

Windows에서 이것은 나를 위해 올바르게 작동 하지 않습니다. 존재하지 않는 파일에 대해 is_symlink반환 true합니다 (따라서을 exists()반환합니다 true).
James Hirschorn

3

이 주제를 부풀 리려는 의도는 없지만 symlink를 찾고 실제 파일로 변환하고 파이썬 도구 라이브러리 내 에서이 스크립트를 찾았 기 때문에이 페이지로 리디렉션되었습니다.

#Source https://github.com/python/cpython/blob/master/Tools/scripts/mkreal.py


import sys
import os
from stat import *

BUFSIZE = 32*1024

def mkrealfile(name):
    st = os.stat(name) # Get the mode
    mode = S_IMODE(st[ST_MODE])
    linkto = os.readlink(name) # Make sure again it's a symlink
    f_in = open(name, 'r') # This ensures it's a file
    os.unlink(name)
    f_out = open(name, 'w')
    while 1:
        buf = f_in.read(BUFSIZE)
        if not buf: break
        f_out.write(buf)
    del f_out # Flush data to disk before changing mode
    os.chmod(name, mode)

    mkrealfile("/Users/test/mysymlink")

여기서 무슨 일이 일어나고 있는지 설명해 주시겠습니까? 실제로 파일 을 다시 쓰기 전에 파일을 제거 (연결 해제)하는 것처럼 보이기 때문에 다소 이상하게 보입니다 . 어떻게 이럴 수있어? 또한 마지막 mkrealfile(...)은 자체 기능과 동일한 수준에 있습니다 ...
not2qubit
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.