Ich benutze SFTP-Server für die Erstellung von Datenbanksicherungen und alle Websites mit ihrer Struktur. Ich verwende ein schlechtes Skript und mache jetzt doppelte Duplikate auf meinem SFTP-Server. Ich benutze rmdir folder, erhalte aber folgende Fehlermeldung:

Couldn't remove directory: Failure

Wenn ich richtig in SFTP verstehe, kann ich Verzeichnis nur entfernen, wenn es leer ist. Und wenn ich rm folder/* verwende, entferne ich keine inneren Ordner.

Wie kann ich es anders machen?

8
itdxer 11 Dez. 2013 im 02:52

3 Antworten

Beste Antwort

Implementieren Sie eine einfache Lösung in Python. Ich denke es hilft jemand in Zukunft

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")
6
Sam Brightman 15 Jän. 2018 im 15:12

Die Lösung von itdxer ist sehr schön, löscht jedoch nicht alles: Sie löscht einen Unterordner nur, wenn er zunächst leer war, andernfalls löscht er nur seinen Inhalt. Es ist auch möglich, es durch Kombinieren von isdir und rm zu verkürzen.

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)
8
r0m1 23 Apr. 2014 im 22:28

Sie können Ihr Remote-Verzeichnis auch mit mounten

sshfs user@yourdomain.com:/path/to/remote local/path

Dann nur noch cd local/path und dann können Sie rm -r folder verwenden

9
user43284 9 Juli 2014 im 09:54