[英]Move files from one directory to another with Paramiko
I have a script that creates and tmp directory on an SFTP server and then puts files in said /tmp
once the transfer is complete however I need to move the files from /tmp
back one directory to root /
.我有一个脚本,它在 SFTP 服务器上创建 tmp 目录,然后在传输完成后将文件放在所述
/tmp
中,但是我需要将文件从/tmp
移回一个目录到 root /
。 Use Paramiko how would I move the files from one remote directory to another?使用 Paramiko 如何将文件从一个远程目录移动到另一个?
Step guide:步骤指南:
Local files -----> Remote Temporary Dir ----> Remote root Dir
本地文件-----> 远程临时目录----> 远程根目录
Code below if needed:如果需要,请使用以下代码:
#!/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")
Use the sftp.rename
:使用
sftp.rename
:
sftp.rename(remotePath+'/tmp/'+fileName, remotePath+fileName)
Note that some SFTP servers fail the request, if the source and target directories are on different file systems.请注意,如果源目录和目标目录位于不同的文件系统上,则某些 SFTP 服务器会使请求失败。
If you need to move set of files from one folder to another, see:如果您需要将一组文件从一个文件夹移动到另一个文件夹,请参阅:
Archive all files from one SFTP folder to another in Python在 Python 中将所有文件从一个 SFTP 文件夹存档到另一个文件夹
I would suggest having also some safeguards.我建议也有一些保障措施。 Sometimes the library will raise an IOError in certain conditions (the destination file exists already or the file to move does not exist).
有时库会在某些情况下引发 IOError (目标文件已经存在或要移动的文件不存在)。 I will assume you have an sftp client
sftp_client
我假设你有一个 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)
As you are already importing the os library use:因为您已经导入了 os 库,请使用:
os.path.join(path, filename)
To obtain correct absolute paths and avoid dealing with duplicated or lacking / by the use of wild concatenations like above:要获得正确的绝对路径并避免处理重复或缺少 / 通过使用像上面这样的野生连接:
ie IE
f_w_current_path = os.path.join(current_path, f.filename)
f_w_temporary_path = os.path.join(temporary_path, f.filename)
sftp.rename(f_w_current_path, f_w_temporary_path)
the use of rename to move the file remotely with paramiko library it's working for me.使用重命名通过 paramiko 库远程移动文件,它对我有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.