如何区分本地文件系统路径和SSH文件系统路径?

1 投票
2 回答
743 浏览
提问于 2025-04-17 19:11

在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

你可以这样做 -

  1. 首先在本地文件系统中检查一个路径 X(这包括像 user@host1:/data/bla.txt 这样的路径)。
  2. 如果路径 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

撰写回答