Как синхронизировать только измененные файлы из удаленного каталога с помощью pysftp?

Я использую функцию get_r библиотеки pysftp (https://pysftp.readthedocs.io/en/release_0.2.9/pysftp.html#pysftp.Connection.get_r), чтобы получить локальную копию структуры каталогов с сервера sftp.

Это правильный подход для ситуации, когда содержимое удаленного каталога изменилось, и я хотел бы получить только те файлы, которые изменились с момента последнего запуска скрипта?

Сценарий должен иметь возможность рекурсивно синхронизировать удаленный каталог и отражать состояние удаленного каталога - например, с параметром, определяющим, следует ли удалять локальные устаревшие файлы (те, которых больше нет на удаленном сервере), и извлекать любые изменения в существующих файлах и новых файлах.

Мой текущий подход здесь.

Пример использования:

from sftp_sync import sync_dir

sync_dir('/remote/path/', '/local/path/')

person Krzysztof Słowiński    schedule 23.11.2017    source источник


Ответы (1)


Для получения списка файлов с атрибутами ( включая временную метку файла).

Затем просмотрите список и сравните с локальными файлами.

import os
import pysftp
import stat

remote_path = "/remote/path"
local_path = "/local/path"

with pysftp.Connection('example.com', username='user', password='pass') as sftp:
    sftp.cwd(remote_path)
    for f in sftp.listdir_attr():
        if not stat.S_ISDIR(f.st_mode):
            print("Checking %s..." % f.filename)
            local_file_path = os.path.join(local_path, f.filename)
            if ((not os.path.isfile(local_file_path)) or
                (f.st_mtime > os.path.getmtime(local_file_path))):
                print("Downloading %s..." % f.filename)
                sftp.get(f.filename, local_file_path)
person Martin Prikryl    schedule 02.02.2018