Frage Wie _MOVE_ Dateien mit scp?


Wie kann ich Dateien nicht kopieren, sondern von einem Server auf einen anderen verschieben (Linux)?

man scp gab mir nichts nützliches. Ich kann nicht 'scp' und dann 'rm' verwenden, da ich sicherstellen muss, dass die Datei erfolgreich übertragen wurde. Wenn während der Übertragung ein Fehler auftritt, darf die Datei nicht gelöscht werden.

Vielleicht sollte ich den Exit-Code irgendwie verwenden, aber wie? Außerdem gibt es viele Dateien, und wenn die letzte Datei fehlschlägt, wäre die Option nicht so gut, die ganze Reihe erfolgreich übertragener Dateien zu behalten.

Vielleicht gibt es etwas außer SCP?


40
2018-02-26 20:11


Ursprung




Antworten:


rsync über ssh ist wahrscheinlich deine beste Wette mit dem --remove-source-files Möglichkeit

rsync -avz --remove-source-files -e ssh /this/dir remoteuser@remotehost:/remote/dir 

ein schneller Test gibt;

[tomh@workstation001 ~]$ mkdir test1
[tomh@workstation001 ~]$ mkdir test2
[tomh@workstation001 ~]$ touch test1/testfile.1
[tomh@workstation001 ~]$ ls test1/
testfile.1
[tomh@workstation001 ~]$ rsync --remove-source-files -av -e ssh test1/testfile.1 tomh@localhost:/home/tomh/test2/
sending incremental file list

sent 58 bytes  received 12 bytes  10.77 bytes/sec
total size is 0  speedup is 0.00

[tomh@workstation001 ~]$ ls test1/
[tomh@workstation001 ~]$
[tomh@workstation001 ~]$ ls test2/
testfile.1

Wie @SvenW erwähnt, -e ssh ist die Voreinstellung und kann daher weggelassen werden.


41
2018-02-26 20:15



-e ssh ist der implizite Standard seit vielen Jahren, es ist normalerweise nicht mehr notwendig, diesen Parameter zu verwenden. - Sven♦
@SvenW ah gut zu wissen! Ich brauche Tag für Tag nicht viel rsync, da scp den rekursiven Modus für die meisten Zwecke unterstützt. - Tom H
Danach leeren Sie alle leeren Ordner (rsync entfernt sie nicht): serverfault.com/a/95935/58568 - bmaupin
Gerade hinzugefügt smv() { rsync -az --remove-source-files "$@"; } zu meiner Toolbox. Vielen Dank. - Rhys Ulerich
Was ist, wenn Sie rsync nicht haben? Zum Beispiel hat OpenWrt nicht rsync und ich muss scp verwenden, um Dateien zu verschieben. Was nun? - valentt


Benutzen rsync anstatt scp:

rsync -avz --remove-source-files /sourcedir user@host:/targetdir 

Weitere Informationen mit man rsync.


16
2018-02-26 20:18





Diese Frage wurde gut beantwortet, und die Antwort wurde akzeptiert, aber da sie oben auf der Titelseite steht, dachte ich, ich würde zumindest versuchen, sie präziser zu beantworten, wenn auch weniger elegant. Ja, Sie können den Rückkehrcode von verwenden scpund ich mache es oft. Im bash:

scp foo user@server:/destination && rm foo

Ich nehme Ihren Punkt über mehrere Dateien zu kopieren und Fehler auf dem Stapel richtig zu behandeln, so für mehrere Dateien:

for file in bar*; do scp "$file" user@server:/destination && rm "$file" ; done

Letzteres ist nur praktisch, wenn Sie es verwenden ssh-agentaber ich hoffe sehr, dass du es bist.


15
2018-04-18 14:23



Ich denke, das sollte die Antwort sein. Es beantwortet die Frage genau. - Travis Griggs
Da SCP nicht (AFAIK) Bandbreitenbeschränkung behandelt, habe ich Ihre hanswer mit rsync verwendet, um Dateien einzeln in einer bestimmten Bandbreite zu verschieben. Vielen Dank ! - Moonchild
@Moonchild, scp kann Bandbreitenlimits tatsächlich mit Hilfe der -l Flagge. Z.B., -l 8192 um Übertragungen bei 8192 kb / s zu begrenzen - Spencer Doak


In meiner Situation ist SSH-Port nicht 22, also

rsync -avz --remove-source-files -e "ssh -p $portNumber" user@remoteip:/path/to/files/ /local/path/

funktioniert bei mir.


2
2017-09-24 05:47



Es ist viel besser, benutzerdefinierte ssh-Portnummern in Ihre ssh-Konfigurationsdatei (~ / .ssh / config) zu schreiben, als sie für jeden Befehl anzugeben. Sie kann global, pro Host oder für einen regulären Ausdruck angegeben werden, der dem Hostnamen entspricht. - sneak
Wie stelle ich Ports einzeln für Quelle und Ziel ein? - Brethlosze


Wenn du einen älteren Zielserver hast als ich, kannst du nicht verwenden

--remove-source-files

aber du musst es benutzen

--remove-sent-files --protocol=29

stattdessen.


2
2018-01-23 17:23





Wenn es in zwei Schritten ist kein Problem, können Sie verwenden scp um die Datei vom Remote-Server zu kopieren und dann auszuführen ssh -e "rm /path/to/file" von der Festplatte entfernen. Wenn Dateien besonders zwischen Rechnern verschoben werden, kann es zu Problemen kommen. Es kann daher sinnvoll sein, die Kopie und das Löschen separat durchzuführen und die Datei nur zu entfernen, wenn Sie sicher sind, dass sie erfolgreich kopiert wurde.


2
2017-07-01 08:39