Загрузка файлов с SFTP-сервера старше 5 дней с использованием Python - PullRequest
0 голосов
/ 24 мая 2019

Я получил скрипт Python на этом сайте, который загружает файлы из каталога с SFTP-сервера. Теперь мне нужна помощь, чтобы изменить этот код так, чтобы он загружал только те файлы, которые старше 5 дней со дня его использования.

Код для загрузки файлов (на основе Python pysftp get_r из Linux отлично работает на Linux, но не на Windows ):

import os
import pysftp
from stat import S_IMODE, S_ISDIR, S_ISREG

cnopts = pysftp.CnOpts()
cnopts.hostkeys = None    
sftp=pysftp.Connection('192.168.X.X', username='username',password='password',cnopts=cnopts)

def get_r_portable(sftp, remotedir, localdir, preserve_mtime=False):
    for entry in sftp.listdir(remotedir):
        remotepath = remotedir + "/" + entry
        localpath = os.path.join(localdir, entry)
        mode = sftp.stat(remotepath).st_mode
        if S_ISDIR(mode):
            try:
                os.mkdir(localpath,mode=777)
            except OSError:     
                pass
            get_r_portable(sftp, remotepath, localpath, preserve_mtime)
        elif S_ISREG(mode):
            sftp.get(remotepath, localpath, preserve_mtime=preserve_mtime)

remote_path=input("enter the remote_path: ")
local_path=input("enter the local_path: ")

get_r_portable(sftp, remote_path, local_path, preserve_mtime=False)

Пожалуйста, помогите мне изменить код так, чтобы он загружал файлы только на 5 дней старше с сегодняшнего дня.

1 Ответ

3 голосов
/ 24 мая 2019

Используйте pysftp.Connection.listdir_attr для получения списка файлов с атрибутами (включая метку времени файла).

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

import time

def get_r_portable(sftp, remotedir, localdir, preserve_mtime=False):
    for entry in sftp.listdir_attr(remotedir):
        remotepath = remotedir + "/" + entry.filename
        localpath = os.path.join(localdir, entry.filename)
        mode = entry.st_mode
        if S_ISDIR(mode):
            try:
                os.mkdir(localpath)
            except OSError:     
                pass
            get_r_portable(sftp, remotepath, localpath, preserve_mtime)
        elif S_ISREG(mode):
            if (time.time() - entry.st_mtime) // (24 * 3600) >= 5:
                sftp.get(remotepath, localpath, preserve_mtime=preserve_mtime)

Хотя код может быть намного проще, если вам не нужна рекурсивная загрузка:

for entry in sftp.listdir_attr(remotedir):
    mode = entry.st_mode
    if S_ISREG(mode) and ((time.time() - entry.st_mtime) // (24 * 3600) >= 5):
       remotepath = remotedir + "/" + entry.filename
       localpath = os.path.join(localdir, entry.filename)
       sftp.get(remotepath, localpath, preserve_mtime=True)

На основании:

...