2017-01-30 15 views
0

フォルダが実際に別のハードリンクへのハードリンクであるかどうかを調べようとしています。フォルダがハードリンクで実際のパスを取得する方法

私は、次のよう(symLink.py)でのpythonでの簡単な例をした:この例のos.path.islinkで

#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.realpathは、ハードリンク用ではなく、ソフトリンク用の実際のパスを返します。

私はこの例をWindows 8のpython 3.4を使って作っています。 私は何か間違っているのか、それを達成する別の方法があるのか​​分かりません。

+0

元のファイルと同じiノードへのハードリンクが指すが、それは、元のファイルを参照していません。したがって、ハードリンクがあれば、元のファイルを特定できるかどうかはわかりません。シンボリックリンクは、元のファイルを名前で参照します。したがって、**シンボリックリンクが与えられたときに元のファイルに到達することは可能です**。だから、あなたが描いている振る舞いは、それがどういう仕組みであるかと思います。 – RobertB

+0

第二に、 'islink'は"シンボリックリンクがPythonランタイムでサポートされていない場合は常にFalse "を返します。おそらくこれはあなたが見ているシンボリックリンクの動作に関連しています。 – RobertB

+1

@RobertBと合意:同じファイルへの2つのハードリンクは、区別できないと考えられています。それらを使用している人の視点からは実際にはリンクされていません。 。あなたができる最良の方法は、同じinode番号を持つすべてのエントリが見つかるまで、ファイルシステム全体をスキャンすることです。実際のシンボリックリンク、つまりNTFSジャンクションを使用していますか? [junctionsがリンクとして適切に検出されない]ようです(https://bugs.python.org/issue29250)。 – ShadowRanger

答えて

0

私は1分のグーグルを過ごし、すべての答えを得ました。ヒントヒント。

ハードリンクであるかどうかを確認するには、すべてのファイルをスキャンして、os.statの結果を比較して、同じiノードを指しているかどうかを確認する必要があります。

Having trouble implementing a readlink() function

(@ShadowRangerあたりのコメントで):例:Windows上のPythonでのシンボリックリンクの場合

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

は、それがトリッキーすることができ...幸いにもこれは既に回答されていますシンボリックリンクの代わりにジャンクションを使用していないことを確認してください。シンボリックリンクが正しくレポートされない可能性があるからです。 - ShadowRanger

https://bugs.python.org/issue29250

+1

その2番目のリンクは必要ありません。 'realpath'(Windows版)が' abspath'の別名だったPythonの3.2より前のバージョンに特有のものです。 3.4では、OPの質問が示すように、パスが解決されているように見えます(ただし、 'os.walk'は' realpath'がそれらに到達する前に 'os.walk'によって解決されている可能性があります。 [follow_symlinks = False'](https://bugs.python.org/issue23407)でもデフォルトのままです)。'realpath'は3.4で動作するはずですが、' 'islink'が正しく接合点を報告しないかもしれません(https://bugs.python.org/issue29250)。 – ShadowRanger

+0

@ ShadowRangerのコメントを含むように更新されました – RobertB

+0

うーん...気にしないでください。少なくとも私のPython 3.4では、 'realpath'は' abspath'のエイリアスのままです。ブリーチ。 – ShadowRanger

関連する問題