2017-01-30 14 views
0

폴더가 실제로 다른 하드 링크로 연결되어 있는지 검색하려고합니다.이 경우 실제 경로를 찾습니다. 이 예에서폴더가 하드 링크이고 실제 경로를 얻는 지 확인하는 방법

#python 3.4 
import os 
dirList = [x[0] for x in os.walk('.')] 

print (dirList) 

for d in dirList: 
    print (os.path.realpath(d), os.path.islink(d)) 

""" 
Given this directories structure: 
<dir_path>\Example\ 
    <dir_path>\Example\symLinks.py 
    <dir_path>\Example\hardLinkToF2 #hard link pointing to <dir_path>\Example\FOLDER1\FOLDER2 
    <dir_path>\Example\softLinkToF2 #soft link pointing to <dir_path>\Example\FOLDER1\FOLDER2 
    <dir_path>\Example\FOLDER1 
     <dir_path>\Example\FOLDER1\FOLDER2 

The output from executing: C:\Python34\python <dir_path>\Example\symLinks.py is: 
['.', '.\\FOLDER1', '.\\FOLDER1\\FOLDER2', '.\\hardLinkToF2'] 
<dir_path>\Example False 
<dir_path>\Example\FOLDER1 False 
<dir_path>\Example\FOLDER1\FOLDER2 False 
<dir_path>\Example\hardLinkToF2 False 
""" 

항상 하드 또는 소프트 링크 모두 False를 반환 os.path.islink :

나는 다음과 같은 방법으로 (symLink.py)에서 파이썬으로 간단한 예제를했다. 한편, os.path.realpath는 하드 링크가 아닌 소프트 링크의 실제 경로를 반환합니다.

Windows 8에서 python 3.4를 사용하여이 예제를 만들었습니다. 잘못된 것을하고 있거나 다른 방법이 있다면 실마리가 없습니다.

+0

원본 파일과 같은 아이 노드에 대한 하드 링크가 가리키는하지만 원래의 파일을 참조하지 않습니다. 따라서 하드 링크가 주어지면 원본 파일을 확인할 수 있는지 확신 할 수 없습니다. 심볼릭 링크는 원래 파일을 이름으로 참조합니다. 따라서 심볼릭 링크가 주어지면 원래 파일로 이동할 수 있습니다 **. 그래서 당신이 묘사하는 행동은 그것이 어떻게 작동하는지 생각합니다. – RobertB

+0

둘째, 문서에서'islink'는 "심볼릭 링크가 파이썬 런타임에서 지원되지 않으면 항상 거짓"을 반환한다고 말합니다. 아마도 이것은 여러분이보고있는 상징적 인 링크 행위와 관련이 있습니다. – RobertB

+1

@RobertB와 동의 : 동일한 파일에 대한 두 개의 하드 링크는 구별 할 수 없으며, 링크를 사용하는 사람의 관점에서 실제로 "링크"되지 않습니다. 기본 파일이 N 개의 다른 장소에서 참조된다는 것만 알면됩니다. . 여러분이 할 수있는 최선의 방법은 동일한 파일 번호를 가진 모든 엔트리를 찾을 때까지 전체 파일 시스템을 스캔하는 것입니다. 그냥 분명히하기 위해 실제 심볼릭 링크 또는 NTFS 연결을 사용하고 있습니까? [교차점이 링크로 제대로 감지되지 않습니다.] (https://bugs.python.org/issue29250)와 같습니다. – ShadowRanger

답변

0

꿀벌은 너무 가혹하지 않지만 1 분 인터넷 검색을하고 모든 답변을 받았습니다. 힌트 힌트.

하드 링크인지 확인하려면 모든 파일을 스캔 한 다음 os.stat 결과를 비교하여 동일한 inode를 가리키는 지 확인해야합니다.

Having trouble implementing a readlink() function

(@ShadowRanger 당 의견) : 예 : Windows에서 파이썬 기호 링크를 들어

https://gist.github.com/simonw/229186

, 그것은 난이도가 될 수 있습니다 ...하지만 다행히이 이미 대답되었습니다 , 올바르게보고하지 않을 수 있으므로 기호 링크 대신 junction을 사용하지 않도록하십시오. - ShadowRanger

https://bugs.python.org/issue29250

+1

두 번째 링크는 필요하지 않습니다. 'realpath' (Windows에서)가'abspath'에 대한 별칭이었던 Python 3.2 이전 버전에만 적용됩니다. 3.4에서 OP의 질문에서 볼 수 있듯이 경로가 해결되고있는 것처럼 보입니다 ('realpath'가 도착하기 전에 'os.walk'에 의해 해결 될 수도 있지만 os.walk는 이해할 수 없기 때문에 가능합니다). junctions, [follow_symlinks = False'] (https://bugs.python.org/issue23407) 기본값으로도 따라옵니다).'realpath'는 3.4에서 작동해야합니다. 단지''islink'가 junction을 올바르게보고하지 않을 수도 있습니다. (https://bugs.python.org/issue29250). – ShadowRanger

+0

@ ShadowRanger의 덧글을 포함하도록 답변이 업데이트되었습니다 – RobertB

+0

흠 ... 신경 쓰지 마세요. 최소한 파이썬 3.4에서는 "realpath"가'abspath'의 별칭으로 남아 있습니다. 블레치. – ShadowRanger