检查Paramiko递归文件传输中是否下载了任何文件

Check if any file was downloaded in Paramiko recursive file transfer

我无法弄清楚为什么当 itemitem.filename(文件的绝对路径)为空时无法在此函数中获取退出代码 1?

def sftp_get_recursive(path, dest, sftp):
    item_list = sftp.listdir_attr(path)
    dest = str(dest)
    if not os.path.isdir(dest):
        os.makedirs(dest, exist_ok=True)
    for item in item_list:
        mode = item.st_mode
        if not str(item) :
           print(item.filename)
           print("No file found")
           sys.exit(1)
        elif S_ISDIR(mode):
           sftp_get_recursive(path + "/" + item.filename, dest + "/" + item.filename, sftp)
        else:
           sftp.get(path + "/" + item.filename, dest + "/" + item.filename)
           print("Sending file from : ",path + "/" + item.filename)
           sftp.remove(path + "/" + item.filename)

如果你想return特定的退出代码,如果目录树中的任何地方都没有文件,你将不得不递归地计算文件。

def sftp_get_recursive(path, dest, sftp):
    count = 0
    item_list = sftp.listdir_attr(path)
    if not os.path.isdir(dest):
        os.makedirs(dest, exist_ok=True)
    for item in item_list:
        source_path = path + "/" + item.filename
        dest_path = os.path.join(dest, item.filename)
        if S_ISDIR(item.st_mode):
           count += sftp_get_recursive(source_path, dest_path, sftp)
        else:
           print("Sending file from : ", source_path)
           sftp.get(source_path, dest_path)
           sftp.remove(source_path)
           count += 1
    return count

(我稍微重构了你的代码以避免重复代码)

然后在顶层使用计数:

count = sftp_get_recursive(path, dest, sftp)
if count == 0:
    print("No file found")
    sys.exit(1)

请注意,即使没有找到文件,代码仍会在本地重新创建空的远程目录结构。我不确定,如果那是你想要的。