使用SFTP递归删除目录

时间:2013-12-10 22:52:48

标签: python console sftp

我使用SFTP服务器进行数据库备份以及所有具有它结构的网站。我使用坏脚本,现在我在SFTP服务器上制作双重复制品。我使用rmdir folder,但收到错误:

Couldn't remove directory: Failure

如果我在SFTP中理解正确,我可以删除目录,只要它是空的。如果我使用rm folder/*,我不会删除内部文件夹。

我怎么能用另一种方式?

3 个答案:

答案 0 :(得分:8)

itdxer的解决方案非常好,但它并没有删除所有内容:它只删除一个子文件夹(如果它是空的,开头),否则它只会删除其内容。通过组合isdir和rm也可以缩短它。

def rm(path):
    files = sftp.listdir(path)

    for f in files:
        filepath = os.path.join(path, f)
        try:
            sftp.remove(filepath)
        except IOError:
            rm(filepath)

    sftp.rmdir(path)

答案 1 :(得分:5)

您也可以使用

安装远程目录
sshfs user@yourdomain.com:/path/to/remote local/path

然后只需cd local/path,然后您可以自由使用rm -r folder

答案 2 :(得分:4)

在python中实现简单的解决方案。我认为将来会有人帮忙

import os
import paramiko
from stat import S_ISDIR

server ="any.sftpserver"
username = "uname"
password = "***"
path_to_hosts_file = os.path.join("~", ".ssh", "known_hosts")

ssh = paramiko.SSHClient()
ssh.load_host_keys(os.path.expanduser(path_to_hosts_file))
ssh.connect(server, username=username, password=password)

def isdir(path):
    try:
        return S_ISDIR(sftp.stat(path).st_mode)
    except IOError:
        return False

def rm(path):
    files = sftp.listdir(path=path)

    for f in files:
        filepath = os.path.join(path, f)
        if isdir(filepath):
            rm(filepath)
        else:
            sftp.remove(filepath)

    sftp.rmdir(path)

if __name__ == "__main__":
    rm("/path/to/some/directory/to/remove")