2015-10-20 78 views
5

使用Python,我需要檢查數百個符號鏈接是否正確,並在沒有時重新創建它們。我現在所做的就是比較我想要的和我擁有的實際路徑,但是它很慢,因爲它是通過使用自動安裝的NFS進行的。如何獲得Python中的符號鏈接目標?

否則,我要用命令'ls -l'運行一個子進程,並在返回的字符串列表上工作。我希望能有一個更好的解決方案,使用Python庫...

EDIT1:我:link_name -> link_target然後link_target -> a_real_file。我需要的是從link_name中提取link_target,而不是a_real_file。我不在乎真實文件是否不存在。

編輯2:也許我沒有正確表達。我的意思是正確的符號鏈接是'指向預定義路徑的鏈接,即使它不存在'。所以,我需要檢查:

link_name_1 -> target_1 
link_name_2 -> target_2 

這就是爲什麼我需要提取的目標,而不是真正的路徑。然後我將它們與參考(字典)進行比較。所以我的問題是:我如何提取目標路徑?

回答

0

要確定某個目錄項是符號鏈接,使用這樣的:

os.path.islink(path)

返回真,如果路徑指向一個目錄項是一個符號鏈接。如果不支持符號鏈接,則始終爲假。

-1

若要確定鏈接是否中斷,您可以,os.walk和測試os.path.exists(path)這將返回False的一個斷開的鏈接。然後,您可以使用os.path.realpath(path)找出鏈接應該指向的內容。
喜歡的東西(未經測試):

for root, dirs, files in os.walk('<path>'): 
    for file in files: 
     f = os.join(root, file) 
     if os.path.islink(f) and not os.path.exist(f): 
      print("Broken: {} -> {}".format(f, os.path.realpath(f))) 
+0

當心os.path.realpath()目前不工作在Windows上(http://bugs.python.org/ issue9949)。 – antred

6

你需要看看os.readlink()

+1

請考慮編輯您的帖子以添加更多關於您的代碼的解釋以及爲什麼它可以解決問題。一個主要包含代碼的答案(即使它正在工作)通常不會幫助OP瞭解他們的問題。 – SuperBiasedMan

+0

謝謝阿明,這正是我需要的。我已經能夠獲得目標,現在任務已經快得多了。 – zorggy

5

os.readlink()的問題是它只會解析鏈接的一個步驟。我們可以有一個情況,其中A鏈接到另一個鏈接B,並且B鏈接懸空。

$ ln -s /tmp/example/notexist /tmp/example/B 
$ ln -s /tmp/example/B /tmp/example/A 
$ ls -l /tmp/example 
A -> /tmp/example/B 
B -> /tmp/example/notexist 

現在在Python中,os.readlink爲您提供了第一個目標。

>>> import os 
>>> os.readlink('A') 
'/tmp/example/B' 

但在大多數情況下,我假設我們對解決的路徑感興趣。所以pathlib可以幫助在這裏:

>>> from pathlib import Path 
>>> Path('A').resolve() 
PosixPath('/tmp/example/notexist') 

對於老版本的Python:

>>> os.path.realpath('A') 
'/tmp/example/notexist'