2013-03-15 2 views
1

В Python на Linux мне нужно различать локальные пути файловой системы à la /mnt/data/wherever/%Y-%m-%d.txt или ~/data/bla.txt, с одной стороны, и SSH «пути» à la [email protected]:/data/bla.txt или [email protected]:blupp.txt.Как различить путь локальной файловой системы и путь к файловой системе через SSH?

Как я могу эффективно это сделать?

EDIT: В моем примере нет файла /mnt/data/wherever/%Y-%m-%d.txt, потому что %Y и т.д., просто заполнители. Поэтому проверка того, существует ли файл/каталог с указанным именем, не будет работать.

+1

символ "@" и ":" являются хорошим началом. Также на вашем втором пути «SSH» вам может понадобиться реализовать некоторую логику о правильном вводе каталога HOME (/ root/для root,/home/user/для пользователя). Тем не менее, нет никакого способа быть уверенным, поскольку user @ host1 является допустимым именем каталога. – dmg

+0

на всех системах, на которых я был до сих пор, '[email protected]: blupp.txt' будет указывать на' [email protected]:/home/user/blupp.txt' (или где бы пользовательский '$ HOME' находится). Поэтому мне было бы безразлично. –

ответ

2

Единственный способ узнать, использовать эвристику, поскольку пути ssh также являются действительными именами файлов (хотя и очень странными).

Из документации Scp:

Имена файлов могут содержать пользователя и хост-спецификации, чтобы указать, что файл должен быть скопирован в/из этого хоста. Локальные имена файлов могут быть сделаны явным, используя абсолютные или относительные пути, чтобы избежать обработки 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

+0

В вашем примере выражение, которое вы проверяете, не является одинаковым в обоих случаях. Это меня смущает, потому что как я должен знать, когда использовать это выражение? –

+0

@ andreas-h sorry Я изменил регулярное выражение, потому что двоеточие в конце должно, вероятно, интерпретироваться как путь ssh, но забыл изменить запрос. Они должны быть одинаковыми. – wds

0

Вы можете сделать это -

  1. Сначала проверьте в локальной файловой системе путь X (это составляет дорожки, как - [email protected]:/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. Чтобы проверить, существует ли путь к существующему файлу в локальной файловой системе:

+0

, поскольку я могу иметь заполнители в строке, указывающей путь, не может быть файла с точным путем строки. см. мое редактирование на вопрос. –

+0

, тогда 'glob' - это то, что вам нужно. python 'glob' поддерживает регулярные выражения. Таким образом, вы все еще можете проверить, существует ли файл или нет. –

Смежные вопросы