如何区分本地文件系统路径和SSH文件系统路径?
在Linux系统的Python中,我需要区分两种不同的路径。第一种是本地文件系统的路径,比如 /mnt/data/wherever/%Y-%m-%d.txt
或者 ~/data/bla.txt
。第二种是SSH的路径,比如 user@host1:/data/bla.txt
或者 user@host2.mydomain.com:blupp.txt
。
我该怎么高效地区分这两种路径呢?
补充说明:在我的例子中,/mnt/data/wherever/%Y-%m-%d.txt
这个文件并不存在,因为 %Y
等只是占位符。所以单纯检查这个名字是否有对应的文件或目录是行不通的。
2 个回答
0
你可以这样做 -
- 首先在本地文件系统中检查一个路径 X(这包括像
user@host1:/data/bla.txt
这样的路径)。 - 如果路径 X 在本地文件系统中不存在,那么就检查
SSH
路径 Y(同时要检查是否有 "@" 和 ":",因为如果没有这些符号,那这个文件在任何机器上都不存在)。
使用 glob 来根据模式列出文件。
>>> import glob
>>> glob.glob('/mnt/data/wherever/*.txt') # all txt files within the directory will be listed
os.path.isfile(path)
会返回 True
,如果这个路径是一个已存在的普通文件。所以这个方法用来检查文件是否已经存在,但不支持通配符。而 glob
是支持的。
要检查本地文件系统中的路径是否是一个已存在的文件,可以使用:
2
知道这个问题的唯一办法就是使用一些经验法则,因为ssh路径也是有效的文件名(虽然看起来很奇怪)。
根据scp的说明:
文件名可以包含用户和主机的信息,以表明文件是要从那个主机复制过来或复制过去。为了避免scp把包含‘:’的文件名当作主机信息,可以使用绝对路径或相对路径来明确本地文件名。
所以你可以检查一下文件名是否以明确的路径开头,或者在正确的位置是否没有冒号。如果是这样,就可以认为它是本地路径;否则就认为它是远程路径。
举个例子:
pattern = '(\.?/|/)|(^:?[^:]*$)'
re.match(pattern, ":home/test") # match, is a local path
re.match(pattern, "user@host:blah") # no match