Ich frage mich, ob es möglich ist, get
Dateien mit sftp
herunterzuladen, aber zu verhindern, dass Dateien, die bereits im Zielordner vorhanden sind, erneut heruntergeladen werden.
sftp
hat begrenzte Fähigkeiten. Der get
Befehl verfügt jedoch über eine Option, mit der der Trick ausgeführt werden kann: get -a
Teil-Downloads werden abgeschlossen. Wenn also eine Datei bereits auf dem Client vorhanden ist und mindestens so groß ist wie die Datei auf dem Server, wird sie nicht heruntergeladen. Wenn die Datei vorhanden, aber kürzer ist, wird das Ende der Datei übertragen. Dies ist sinnvoll, wenn die lokale Datei das Produkt eines unterbrochenen Downloads ist.
Der einfachste Weg, komplexe Dinge über SFTP zu erledigen, ist die Verwendung von SSHFS . SSHFS ist ein Dateisystem, das SFTP verwendet, um ein entferntes Dateisystem als lokales Dateisystem anzuzeigen. Auf dem Client benötigt SSHFS FUSE , das auf den meisten modernen Unices verfügbar ist. Auf dem Server erfordert SSHFS SFTP. Wenn der Server SFTP zulässt, können Sie SSHFS damit verwenden.
mkdir server
sshfs server.example.com:/ server
rsync -a server/remote/path /local/path/
fusermount -u server
Beachten Sie, dass rsync über SSHFS den Delta-Übertragungsalgorithmus nicht nutzen kann, da er auf der Remote-Seite keine partiellen Prüfsummen berechnen kann. Das ist für einen einmaligen Download irrelevant, aber verschwenderisch, wenn Sie geänderte Dateien synchronisieren. Verwenden Sie für eine effiziente Synchronisierung geänderter Dateien rsync -a server:/remote/path /local/path/
SSH-Shell-Zugriff, nicht nur SFTP-Zugriff. Der Shell-Zugriff kann jedoch auf den Befehl rsync beschränkt werden.
Sie können das -a
Flag für den get
Befehl verwenden:
$ sftp example.com
sftp> get -a hello.txt
Sie können *
natürlich angeben , dass das gesamte Verzeichnis heruntergeladen werden soll.
Es gibt jedoch einige Einschränkungen.
Eine bessere Option wäre die Verwendung von rsync
:
rsync example.com:hello.txt
Auf diese Weise erhalten Sie die Datei immer so, wie sie sich auf dem Server befindet. Dabei werden nur die Unterschiede zwischen der lokalen und der Remotekopie übertragen, sofern sie sich unterscheiden, und sie ist universell verfügbar.