Jak _MOVE_ pliki z SCP?

46

Jak nie kopiować, ale przenosić pliki z jednego serwera na inny (oba Linux)?

man scpnie dał mi nic przydatnego. Nie mogę użyć „scp”, a następnie „rm”, ponieważ muszę się upewnić, że plik został pomyślnie przesłany. Jeśli podczas przesyłania wystąpi błąd, pliku nie można usunąć.

Być może powinienem jakoś użyć kodu wyjścia, ale jak? Ponadto istnieje wiele plików, a jeśli ostatni plik zawiedzie, nie byłaby to tak dobra opcja, aby zatrzymać całą masę pomyślnie przesłanych plików.

Może jest coś poza SCP?

Putnik
źródło

Odpowiedzi:

47

rsync over ssh jest prawdopodobnie najlepszym --remove-source-fileswyborem z opcją

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

szybki test daje;

[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

Jak wspomniano @ SvvenW, -e sshjest to ustawienie domyślne, więc można je pominąć.

Tom H.
źródło
7
-e sshjest domyślną domyślną wartością od wielu lat, zwykle nie ma już potrzeby używania tego parametru.
Sven
@ SvvenW ah dobrze wiedzieć! Nie potrzebuję dużo rsync z dnia na dzień, ponieważ scp obsługuje tryb rekurencyjny do większości celów.
Tom H
Następnie użyj tego do wyczyszczenia pustych folderów (rsync ich nie usunie): serverfault.com/a/95935/58568
bmaupin
1
Właśnie dodałem smv() { rsync -az --remove-source-files "$@"; }do mojego zestawu narzędzi. Dziękuję Ci.
Rhys Ulerich
Co jeśli nie masz rsync? Na przykład OpenWrt nie ma rsync i muszę używać scp do przenoszenia plików. Co zrobić teraz?
valentt
19

Użyj rsynczamiast scp:

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

Więcej informacji z man rsync.

Sven
źródło
17

Odpowiedź na to pytanie jest w porządku, a odpowiedź zaakceptowana, ale ponieważ została przeniesiona na górę pierwszej strony, pomyślałam, że przynajmniej spróbuję odpowiedzieć na nią dokładniej, jeśli mniej elegancko. Tak, możesz użyć kodu powrotu z scp, a ja robię to często. W bash:

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

Rozumiem twój punkt widzenia na temat wielu plików do poprawnego skopiowania i obsługi awarii na stosie, więc w przypadku wielu plików:

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

To ostatnie jest praktyczne, jeśli używasz ssh-agent, ale mam wielką nadzieję, że tak.

MadHatter obsługuje Monikę
źródło
1
Myślę, że to powinna być odpowiedź. Odpowiada dokładnie na zadane pytanie.
Travis Griggs,
Ponieważ SCP nie obsługuje ograniczeń pasma (AFAIK), użyłem twojego hanswer z rsync do przenoszenia plików jeden po drugim na zdefiniowanym pasmie. Dzięki !
Moonchild
@Moonchild, scp faktycznie może obsłużyć limity przepustowości za pomocą -lflagi. Na przykład, -l 8192aby ograniczyć transfery na poziomie 8192 kb / s
Spencer D
3

w mojej sytuacji port ssh nie ma 22, więc

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

pracuje dla mnie.

duży kot
źródło
5
O wiele lepiej jest umieścić niestandardowe numery portów ssh w pliku konfiguracyjnym ssh (~ / .ssh / config) niż podawać je dla każdej komendy. Można go określić globalnie, dla jednego hosta lub dla wyrażenia regularnego pasującego do nazwy hosta.
sneak
Jak ustawić porty indywidualnie dla źródła i miejsca docelowego?
Brethlosze
3

jeśli masz starszy serwer docelowy, tak jak ja, nie możesz go użyć

--remove-source-files

ale musisz użyć

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

zamiast.

andrej
źródło
3

Jeśli wykonanie tego w dwóch krokach nie stanowi problemu, możesz użyć scpdo skopiowania pliku ze zdalnego serwera, a następnie wykonać go w ssh -e "rm /path/to/file"celu usunięcia z dysku. Podczas przenoszenia plików, szczególnie między komputerami, może się nie udać, więc dobrze jest wykonać osobne kopiowanie i usuwanie, a plik należy usuwać tylko wtedy, gdy masz pewność, że został on pomyślnie skopiowany jako pierwszy.

Giannis
źródło