Ich möchte das Verhalten des berühmten Linux rsync-Befehls nachahmen, wo es das gesamte Verzeichnis von "test" kopiert, wenn das "/" nicht am Ende eines Verzeichnisses angegeben ist und kopiert alles innerhalb der " test/"wenn das"/"vorhanden ist. Meine lokalen Ordner "Test" ist Struktur wie folgt:Kopieren von Verzeichnissen mit Paramiko SFTP
test
.
├── fileA.txt
├── fileB.txt
├── test1
│ └── test3
│ └── file3.txt
└── test2
└── file2.txt
den gesamten lokalen Testordner auf Remote-Server in rsync zu kopieren:
rsync -avzP test [email protected]:/home/
Innerhalb Home-Verzeichnis des entfernter_host wäre
home
.
|__ test
├── fileA.txt
├── fileB.txt
├── test1
│ └── test3
│ └── file3.txt
└── test2
└── file2.txt
Beispiel A
Kopieren alles in den lokalen Ordner "Test" ohne selbst:
rsync -avzP test/ [email protected]:/home/
Die Struktur für Home-Verzeichnis wäre:
home/
.
├── fileA.txt
├── fileB.txt
├── test1
│ └── test3
│ └── file3.txt
└── test2
└── file2.txt
Beispiel B
Der Code, den ich habe, ist nicht Ich habe daran gedacht, die Pfade zu teilen und den "Test" loszuwerden, dann alles darin zu kopieren, aber es führt mich nur zu endlosen, verschachtelten For-Schleifen. Eine andere Idee ist es, os.listdir zu verwenden. Wenn es sich um ein Verzeichnis handelt, listen Sie das Verzeichnis erneut auf und kopieren Sie den Inhalt in dieses Verzeichnis. Dies ist noch eine weitere endlose Schleife. Die obige Baumstruktur ist ein vereinfachtes Beispiel, aber im wirklichen Leben wissen wir alle, dass das Verzeichnis 5 Ebenen tief sein könnte. Wie kann ich Beispiel B implementieren?
def put (self, localpath, remotepath):
sftp = self.ssh.open_sftp()
# Create remote directory if it doesn't exist
try:
sftp.stat (remotepath)
except FileNotFoundError:
sftp.mkdir (remotepath)
if os.path.isfile (localpath):
# Obtain file name from local path & append to remote path
path = os.path.split (localpath) # Returns a tuple (directory, filename)
remote_filename = os.path.join (remotepath, path [1])
print (' Copying %s' % remote_filename)
sftp.put (localpath, remote_filename)
elif os.path.isdir (localpath):
p = os.path.join (remotepath, localpath)
try:
sftp.stat (p)
except FileNotFoundError:
sftp.mkdir (p)
for dirpath, dirnames, filenames in os.walk (localpath):
# Traverse into each child directory and create sub directory if it doesn't exist
if dirnames:
for dirname in dirnames:
subdir = os.path.join (dirpath, dirname)
try:
sftp.stat (subdir)
except FileNotFoundError:
sftp.mkdir (subdir)
for filename in filenames:
local_filename = os.path.join (dirpath, filename)
remote_filename = os.path.join (remotepath, local_filename)
sftp.put (local_filename, remote_filename)