使用 Python 从 SFTP 服务器下载超过 5 天的文件
Download files from SFTP server that are older than 5 days using Python
我在这个站点上得到了一个 Python 脚本,可以从 SFTP 服务器的目录下载文件。现在我需要帮助来修改此代码,以便它只下载从代码使用之日起超过 5 天的文件。
下载文件的代码(基于):
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 天前的文件。
使用 pysftp.Connection.listdir_attr
获取带有属性(包括文件时间戳)的文件列表。
然后,迭代列表并只选择您想要的文件。
import time
from stat import S_ISDIR, S_ISREG
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)
不过请注意,pysftp 似乎已死。考虑改用 Paramiko。它有几乎相同的 API,所以上面的代码几乎可以按原样工作(除了 Paramiko 没有 preserve_mtime
参数)。另见 .
基于:
(我已将您的代码源更新为使用 listdir_attr
,因为它更有效)
- Delete files that are older than 7 days
我在这个站点上得到了一个 Python 脚本,可以从 SFTP 服务器的目录下载文件。现在我需要帮助来修改此代码,以便它只下载从代码使用之日起超过 5 天的文件。
下载文件的代码(基于
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 天前的文件。
使用 pysftp.Connection.listdir_attr
获取带有属性(包括文件时间戳)的文件列表。
然后,迭代列表并只选择您想要的文件。
import time
from stat import S_ISDIR, S_ISREG
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)
不过请注意,pysftp 似乎已死。考虑改用 Paramiko。它有几乎相同的 API,所以上面的代码几乎可以按原样工作(除了 Paramiko 没有 preserve_mtime
参数)。另见
基于:
(我已将您的代码源更新为使用listdir_attr
,因为它更有效)- Delete files that are older than 7 days