使用python比较远程目录和本地目录上的文件

Posted

技术标签:

【中文标题】使用python比较远程目录和本地目录上的文件【英文标题】:comapare files that are on remote directory and local directory using python 【发布时间】:2019-05-27 06:11:56 【问题描述】:

我在这个站点上有一个代码,可以从服务器的远程目录下载文件。现在我想修改此代码,以便它比较远程目录上而不是本地目录上的文件和列表。它列出了远程目录和本地目录之间不常见的文件。 这可能吗? 请帮忙。提前致谢

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

cnopts = pysftp.CnOpts()
cnopts.hostkeys = None

IP = "192.168.X.X"
myUsername = "user"
port = 22
myPassword = "password"

try:
    with pysftp.Connection(host=IP, username=myUsername, password=myPassword, cnopts=cnopts) as sftp:
        try:
            r=str(socket.gethostbyaddr(IP))
            print("connection successful with "+r)


            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)
        except socket.herror:
            print("Unknown host")
except:
    print("connection failed")

结果应该是存在于远程目录而不是本地目录中的不常见文件。

【问题讨论】:

不,这不可能。请通过以下链接。 Check it here @ashok knv 请看下面的答案 How to sync only the changed files from the remote directory using pysftp?的可能重复 【参考方案1】:

如果您想下载新文件和不在本地系统上的文件,请使用 rsync。您可以将本地目录与远程目录同步,如下所示:

rsync -a ~/dir1 username@remote_host:destination_directory

如何在python中使用:

import subprocess

args = ["rsync", "-av", "-e", "ssh", "user@server:/tmp/", "/home/local/Desktop/"]
subprocess.call(args)

你可以通过--password-file开关,它必须指向一个包含ssh密码的文件,或者你可以使用ssh key。

【讨论】:

是否适用于python? 可以通过Subprocess或者os模块运行。 如果您觉得方便,可以举个例子吗? 当然,编辑了之前的答案并添加了简单的示例。 我试过了,但总是失败。如果方便,您可以将上述 r 同步代码应用于我的代码吗?谢谢【参考方案2】:
def getFilesList(path):
files = []
for (dirpath, dirnames, filenames) in os.walk(path):
    files.extend(filenames)
    return files
ServerFiles = getFilesList(Srverpath)
LocalFiles = getFilesList(Lclpath) 
fileDiffList = []
for file in ServerFiles: 
    if file in LocalFiles: 
        pass 
    else:
        fileDiffList.append(file) 

我们可以通过使用 2 个单独的列表来获取不常见的文件。 通过传递您的服务器路径和本地文件路径两次调用 getFilesList 方法。 最后,您的“fileDiffList”将具有文件名

【讨论】:

以上是关于使用python比较远程目录和本地目录上的文件的主要内容,如果未能解决你的问题,请参考以下文章

Python 文件目录比较工具filecmp和difflib

将本地目录推送到Git远程仓库

不要使用 WinSCP 将整个本地文件夹传输到远程目录,而只传输其中的文件

Docker远程上的Pycharm远程解释器:[Errno 2]没有这样的文件或目录

使用 WinSCP 将今天的文件从远程目录同步到本地目录

linux文件拷贝到其他机器