2013-07-29 70 views
0

我正在開發一個工具,可以根據多種條件刪除網絡路徑上的文件。我想排除某些被檢查的路徑,並且無法找到合適的方法。無論網絡協議如何匹配文件路徑

一些路徑的程序處理是爲如下:

nfs_path = "nfs://Sharepoint/Path/to/Folder/File.ext" 
smb_path = "smb://SERVER/Sharepoint/Path/to/Folder/File.ext" 
afp_path = "afp://server/Sharepoint/Path/to/Folder/File.ext" 
upnp_path = "upnp://277b787b-5b27-b46f-1687-91100ada8d1f/Path/to/Folder/File.ext" 

exclusion = "smb://user:[email protected]/E/Downloads/Path/to/Folder" 

正如你可以看到一些路徑的使用憑證,而有的則沒有。這些網絡路徑應該能夠彼此匹配。

總之,我想得到確認File.ext,使用任何協議,是Folder(我排除了檢查)的一部分。由於我不是具有路徑操作或正則表達式的專家,因此我處於困境中。我嘗試了下面的正則表達式,這對於NFS路徑來說是失敗的,因爲它也需要共享名稱(E)。 UPnP路徑完全失敗,因爲它們的性質完全不同。

"(?P<protocol>((smb|nfs|afp|upnp)://((.+:[email protected])?.+?/)?))?(?P<directory>.+)" 

我也嘗試過使用os.path模塊,但這些方法似乎並不合適。

在等待一個答案是比較有效的,我建了一個正確的解析正則表達式,將只捕獲文件夾結構,而忽略了前綴:

"(?:smb|afp|nfs|upnp)://(?:(?:.+):(?:.+)@)?(?:.+?)/(?P<tail>.*)$" 

任何人都可以點我的更高效的方向進場?我認爲這會耗費太多的內存來測試很多不同的文件。

它需要在python 2.6或更低版本上工作,因爲它是一個現有程序的插件。

+0

爲什麼你挑出NFS作爲取共享名稱時,SMB甚至本地路徑還包括「E」?它總是有E嗎?你可以拆分第一個'E',並將其餘的字符串作爲路徑,在開始時剝離可選的':'來解釋local_path? –

+0

只有當我使用NFS作爲正則表達式的輸入時,它是否也會使用'E'。我提到的所有其他路徑都工作正常,因爲正則表達式假定服務器名稱,NFS不使用。 共享名稱與文件名稱不同。用戶選擇要從檢查中排除的路徑。如果該路徑上有文件,則不應刪除它們。 –

+0

你見過'os.path.splitunc'嗎?我不在Windows上,所以我無法測試它。 –

回答

0

如果您的網絡和本地目錄完全相同,則可以使用os.walk(local)通過更改驅動器來獲取網絡目錄。

import os 
networkdir = "Z:\\" 
localdir = "C:\\" 

for dirs,subdirs,files in os.walk(localdir): 
    if os.path.join(localdir,dirs) == excluded: 
     continue 
    for filename in files: 
     localfile = os.path.join(localdir,dirs,filename) 
     networkfile = os.path.join(networkdir,dirs,filename) 

要檢查文件是否是一個文件夾中被排除在外:

excludedpath = "C:\excluded\" 
filename = "file.ext" 
os.path.exists(os.path.join(excludedpath,filename)) 
+0

我忘了補充一點,網絡路徑不會總是作爲共享掛載。這是爲了儘可能地創造靈活性。另外,我錯誤地增加了本地路徑和網絡路徑應該可互換的要求。情況並非如此,我已經更新了這個問題來反映這一點。只有(未安裝的)網絡路徑(無論是否帶有嵌入憑證)必須可互換。我想這會使你提供的'os.walk'例子失效,對此我很抱歉。 –