2013-03-15 152 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