【问题标题】:Move files from one directory to another with Paramiko使用 Paramiko 将文件从一个目录移动到另一个目录
【发布时间】:2015-03-30 08:53:06
【问题描述】:

我有一个脚本,它在 SFTP 服务器上创建和 tmp 目录,然后在传输完成后将文件放入所述/tmp,但是我需要将文件从/tmp 移回一个目录到根目录/。使用 Paramiko 我如何将文件从一个远程目录移动到另一个目录?

步骤指南:

本地文件 -----> 远程临时目录 ----> 远程根目录

如果需要,下面的代码:

#!/usr/bin/python

# --------------------------------------------------------------------
#import libraries
# --------------------------------------------------------------------
import paramiko as PM
import os
import datetime

# --------------------------------------------------------------------
# Global Variables
# --------------------------------------------------------------------

host = 'host IP address'
port = 22
username = 'Username'
password = '*********'

# Variable Paths

localPath = '/shares/MILKLINK/fromML'
remotePath = '/'
logPath = '/shares/MILKLINK/logs/PPcfg02.log'
SRCfiles = '/shares/MILKLINK/Milklink.cpy'

# --------------------------------------------------------------------
#  Create LOG FILE
# --------------------------------------------------------------------

log = open(logPath, 'a')
log.write(datetime.datetime.now().isoformat()+'\n')

# Creating lockfile

if(os.path.isfile('LockSFTP')):
    log.write("LOCK FILE STILL EXISTS!")
    quit()
else:    
    os.system(">LockSFTP")

# --------------------------------------------------------------------
# Remove all files from /formML/ 
# --------------------------------------------------------------------

fileList = os.listdir(localPath)
for fileName in fileList:
    try:
        os.remove(localPath+"/"+fileName)
    except OSError:
        log.write("%s could not be deleted\n" % fileName)

# --------------------------------------------------------------------
#  Create SFTP CONNECTION
# --------------------------------------------------------------------

log.write("Starting Connection...\n")
# SSH connection
ssh_Connection = PM.Transport((host, port))
ssh_Connection.connect(username = username, password = password)

# Creaat SFTP CLIENT SERVICES
sftp = PM.SFTPClient.from_transport(ssh_Connection) 

log.write("Connection Established...\n")

remoteList = sftp.listdir(remotePath)
fileList = os.listdir(SRCfiles)
try:
    sftp.chdir(remotePath+'/tmp')
except IOError:
    sftp.mkdir(remotePath+'/tmp')
    sftp.chdir(remotePath+'/tmp')

for fileName in fileList:
    if 'comphaulier.asc' not in remoteList:
        if 'Last' in fileName:
            continue
        else:
            sftp.put(SRCfiles+'/'+fileName, remotePath+'/tmp/'+fileName)

        log.write(fileName+" Transferred\n")
    else:
        log.write("Files Still Exist\n")
        log.close()
        quit()

checkList = sftp.listdir(remotePath)

if len(checkList) == 7:
    sftp.put(SRCfiles+'/LastFile.lst', remotePath+'/LastFile.lst')
    log.write("LastFile.lst Transferred\n")
else:
    log.write("Not all files transferred!!!\n")
    quit()

sftp.close()
ssh_Connection.close()

os.system("rm LockSFTP")

【问题讨论】:

    标签: python linux ssh sftp paramiko


    【解决方案1】:

    使用sftp.rename

    sftp.rename(remotePath+'/tmp/'+fileName, remotePath+fileName)
    

    请注意,如果源目录和目标目录位于不同的文件系统上,某些 SFTP 服务器会导致请求失败。


    如果您需要将一组文件从一个文件夹移动到另一个文件夹,请参阅:
    Archive all files from one SFTP folder to another in Python

    【讨论】:

      【解决方案2】:

      我建议也有一些保护措施。有时库会在某些情况下引发 IOError(目标文件已存在或要移动的文件不存在)。我假设你有一个 sftp 客户端 sftp_client

      def move_file(self, source, destination):
          destination_file_exists = __file_exists(destination)
          source_file_exists = __file_exists(source)
          if destination_file_exists:
              # handle the condition accordingly
              print(f"destination file {destination} already exists")
          else:
              if source_file_exists:
                  sftp_client.rename(source, destination)
              else:
                  # handle the condition accordingly
                  print(f"source file {source} does not exist")
      
      def __file_exists(file_path):
          try:
              sftp_client.stat(file_path)
              return True
          except FileNotFoundError as e:
              return False
          except Exception as e:
              print(e)
      

      【讨论】:

        猜你喜欢
        • 2017-07-20
        • 1970-01-01
        • 1970-01-01
        • 2014-04-16
        • 2019-09-26
        • 1970-01-01
        • 2017-06-09
        • 1970-01-01
        • 2014-12-04
        相关资源
        最近更新 更多