2013-03-15 161 views
1

在Linux上的Python中,我需要區分本地文件系統路徑,一方面是la /mnt/data/wherever/%Y-%m-%d.txt~/data/bla.txt,另一方面是SSH「路徑」àla [email protected]:/data/bla.txt[email protected]:blupp.txt如何通過SSH區分本地文件系統路徑和文件系統路徑?

我該如何有效地做到這一點?

編輯:在我的例子中,沒有文件/mnt/data/wherever/%Y-%m-%d.txt,因爲%Y等只是佔位符。所以檢查一個具有給定名稱的文件/目錄是否存在不起作用。

+1

的 「@」 和 「:」 是一個良好的開端。同樣在你的第二個「SSH」路徑中,你可能需要實現一些關於正確獲取HOME目錄的邏輯(/ root/root用戶,/ home/user /用戶)。但是,無法真正確定,因爲user @ host1是有效的目錄名稱。 – dmg 2013-03-15 10:20:21

+0

到目前爲止我所使用過的所有系統上,'[email protected]:blupp.txt'指向'[email protected]:/ home/user/blupp.txt'(或者任何地方用戶的'$ HOME'位於)。所以我不會在意這一點。 – 2013-03-15 10:28:33

回答

2

要知道的唯一方法是使用啓發式,因爲ssh路徑也是有效的文件名(儘管非常怪異)。

從SCP文件:

文件名可能包含用戶和主機規格,表明 文件是從該主機複製到/。可以使用絕對路徑名或相對路徑名來顯式地使用本地文件名 ,以避免將包含':'的名稱作爲主機說明符處理文件 。

因此,檢查它們是否作爲顯式路徑啓動,或者在正確的位置沒有冒號。然後假設它是一個本地路徑,否則就認爲它是一個遠程路徑。

例子:

pattern = '(\.?/|/)|(^:?[^:]*$)' 
re.match(pattern, ":home/test") # match, is a local path 
re.match(pattern, "[email protected]:blah") # no match 
+0

你也可以假設user @ host是一個ssh路徑而不是一個本地路徑(我相信scp和ssh是否會將它解釋爲本地)。需要稍微改變一下正則表達式,可能只是對這個簡單的情況做一個單獨的檢查。 – wds 2013-03-15 10:39:28

+0

在您的示例中,您檢查的表達式在兩種情況下都不相同。這讓我困惑,因爲我應該怎麼知道何時使用哪種表達方式? – 2013-03-15 10:41:11

+0

@ andreas-h對不起,我改變了正則表達式,因爲最後的冒號應該被解釋爲一個ssh路徑,但忘記了改變查詢。他們應該都是一樣的。 – wds 2013-03-15 10:53:55

0

你可以做到這一點 -

  1. 在本地文件系統的路徑X(這佔像路徑 - [email protected]:/data/bla.txt)首先檢查。
  2. 如果路徑X不存在於本地文件系統中,那麼檢查路徑Y(對「@」和「:」進行附加檢查,否則該文件不存在於任何機器中)爲SSH

使用glob根據模式列出文件。

>>> import glob 
>>> glob.glob('/mnt/data/wherever/*.txt') # all txt files within the directory will be listed 

os.path.isfile(path)回報True如果路徑是現有的常規文件。這用於檢查文件是否已經存在,並且不支持通配符。 glob呢。 要檢查路徑是否是本地文件系統中的現有文件,請使用:

+0

因爲我可以在指示路徑的字符串中包含佔位符,所以可能沒有具有字符串確切路徑的文件。看到我的編輯問題。 – 2013-03-15 10:31:17

+0

然後'glob'就是你需要的。 python'glob'支持正則表達式。所以你仍然可以檢查文件是否存在。 – 2013-03-15 10:33:43