Wie _MOVE_ Dateien mit SCP?

46

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

man scphat mir nichts nützliches gegeben. Ich kann 'scp' und dann 'rm' nicht 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 irgendwie Exit-Code verwenden, aber wie? Außerdem gibt es viele Dateien, und wenn die letzte Datei fehlschlägt, ist es keine so gute Option, den gesamten Haufen erfolgreich übertragener Dateien beizubehalten.

Vielleicht gibt es noch etwas anderes als SCP?

Putnik
quelle

Antworten:

47

rsync über ssh ist wahrscheinlich die beste --remove-source-filesWahl mit dieser Option

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 bereits erwähnt, -e sshist dies der Standard und kann weggelassen werden.

Tom H
quelle
7
-e sshist seit vielen Jahren der implizite Standardwert. In der Regel muss dieser Parameter nicht mehr verwendet werden.
Sven
@SvenW ah gut zu wissen! Ich brauche nicht viel für rsync Tag für Tag, da scp für die meisten Zwecke den rekursiven Modus unterstützt.
Tom H
Bereinigen Sie anschließend alle leeren Ordner mit diesem Befehl
bmaupin
1
Gerade smv() { rsync -az --remove-source-files "$@"; }zu meiner Toolbox hinzugefügt . Danke.
Rhys Ulerich
Was ist, wenn Sie kein rsync haben? Zum Beispiel hat OpenWrt kein rsync und ich muss scp verwenden, um Dateien zu verschieben. Was nun?
Valentin
19

Verwenden Sie rsyncanstelle von scp:

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

Mehr Infos mit man rsync.

Sven
quelle
17

Diese Frage wurde gut beantwortet und die Antwort akzeptiert, aber da sie ganz 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 scp, und ich mache es oft. In bash:

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

Ich gehe davon aus, dass mehrere Dateien kopiert und Fehler im Stapel richtig behandelt werden, also 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-agent, aber ich hoffe sehr, dass Sie es sind.

MadHatter unterstützt Monica
quelle
1
Ich denke, das hätte die Antwort sein sollen. Es beantwortet die gestellte Frage genau.
Travis Griggs
Da SCP die Bandbreitenbeschränkung (AFAIK) nicht handhabt, habe ich Ihren Hanswer mit rsync verwendet, um Dateien nacheinander mit einer definierten Bandbreite zu verschieben. Vielen Dank !
Moonchild
@ Moonchild, scp kann tatsächlich mit Bandbreitenbeschränkungen umgehen, indem es das -lFlag verwendet. -l 8192Zum Beispiel, um Transfers auf 8192 kb / s zu begrenzen
Spencer D
3

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.

große Katze
quelle
5
Es ist viel besser, benutzerdefinierte SSH-Portnummern in die SSH-Konfigurationsdatei (~ / .ssh / config) einzufügen, als sie für jeden Befehl anzugeben. Sie kann global, pro Host oder für einen regulären Ausdruck angegeben werden, der mit dem Hostnamen übereinstimmt.
Sneak
Wie werden die Ports sowohl für die Quelle als auch für das Ziel individuell festgelegt?
Brethlosze
3

Wenn Sie einen älteren Zielserver als ich haben, können Sie ihn nicht verwenden

--remove-source-files

aber du musst verwenden

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

stattdessen.

andrej
quelle
3

Wenn dies in zwei Schritten problemlos möglich ist, können Sie scpdie Datei vom Remote-Server kopieren und anschließend ausführen ssh -e "rm /path/to/file", um sie von der Festplatte zu entfernen. Beim Verschieben von Dateien, insbesondere zwischen Computern, kann es vorkommen, dass Probleme auftreten. Daher empfiehlt es sich, das Kopieren und Löschen separat durchzuführen und die Datei nur dann zu entfernen, wenn Sie sicher sind, dass sie zuerst erfolgreich kopiert wurde.

Giannis
quelle