フォルダが実際に別のハードリンクへのハードリンクであるかどうかを調べようとしています。フォルダがハードリンクで実際のパスを取得する方法
私は、次のよう(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を使って作っています。 私は何か間違っているのか、それを達成する別の方法があるのか分かりません。
元のファイルと同じiノードへのハードリンクが指すが、それは、元のファイルを参照していません。したがって、ハードリンクがあれば、元のファイルを特定できるかどうかはわかりません。シンボリックリンクは、元のファイルを名前で参照します。したがって、**シンボリックリンクが与えられたときに元のファイルに到達することは可能です**。だから、あなたが描いている振る舞いは、それがどういう仕組みであるかと思います。 – RobertB
第二に、 'islink'は"シンボリックリンクがPythonランタイムでサポートされていない場合は常にFalse "を返します。おそらくこれはあなたが見ているシンボリックリンクの動作に関連しています。 – RobertB
@RobertBと合意:同じファイルへの2つのハードリンクは、区別できないと考えられています。それらを使用している人の視点からは実際にはリンクされていません。 。あなたができる最良の方法は、同じinode番号を持つすべてのエントリが見つかるまで、ファイルシステム全体をスキャンすることです。実際のシンボリックリンク、つまりNTFSジャンクションを使用していますか? [junctionsがリンクとして適切に検出されない]ようです(https://bugs.python.org/issue29250)。 – ShadowRanger