Como _MOVE_ arquivos com scp?

46

Como não copiar, mas mover arquivos de um servidor para outro (ambos Linux)?

man scpnão me deu nada de útil. Não posso usar 'scp' e 'rm' porque devo garantir que o arquivo seja transferido com êxito. Se houver algum erro durante a transferência, o arquivo não deve ser excluído.

Talvez eu devesse usar o código de saída de alguma forma, mas como? Além disso, existem muitos arquivos e, se o último arquivo falhar, seria uma opção não tão boa manter todo o conjunto de arquivos transferidos com êxito.

Talvez haja algo além de SCP?

Putnik
fonte

Respostas:

47

rsync over ssh é provavelmente a sua melhor aposta com a --remove-source-filesopção

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

um teste rápido dá;

[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

Como o @SvenW mencionado, -e sshé o padrão, portanto pode ser omitido.

Tom H
fonte
7
-e sshé o padrão implícito há muitos anos, geralmente não há mais necessidade de usar esse parâmetro.
Sven
@ SvenW ah bom saber! Não tenho muita necessidade de rsync no dia a dia, pois o scp suporta o modo recursivo para a maioria dos propósitos.
Tom H
Depois que o uso desta para limpar todas as pastas vazias (rsync não irá removê-los): serverfault.com/a/95935/58568
bmaupin
1
Acabei de adicionar smv() { rsync -az --remove-source-files "$@"; }à minha caixa de ferramentas. Obrigado.
Rhys Ulerich
E se você não tiver o rsync? Por exemplo, o OpenWrt não possui rsync e preciso usar o scp para mover arquivos. O que fazer agora?
23416 #
19

Use em rsyncvez de scp:

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

Mais informações com man rsync.

Sven
fonte
17

Essa pergunta foi respondida com perfeição e a resposta aceita, mas como ela foi colocada no topo da primeira página, pensei em pelo menos tentar respondê-la com mais precisão, se menos com elegância. Sim, você pode usar o código de retorno de scp, e eu faço isso frequentemente. Em bash:

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

Entendo seu argumento sobre vários arquivos para copiar e manipular a falha corretamente na pilha, assim, para vários arquivos:

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

Este último só é prático se você estiver usando ssh-agent, mas espero que esteja.

MadHatter apoia Monica
fonte
1
Eu sinto que isso deveria ter sido a resposta. Responde à pergunta com precisão.
Travis Griggs
Como o SCP não lida com a limitação de largura de banda (AFAIK), usei o hanswer with rsync para mover arquivos um por um em uma largura de banda definida. Obrigado !
Moonchild
@ Moonchild, o scp pode lidar com os limites de largura de banda usando a -lflag. Por exemplo, -l 8192para limitar transferências a 8192 kb / s
Spencer D
3

na minha situação, a porta ssh não é 22, então

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

funciona para mim.

gato grande
fonte
5
É muito melhor colocar números de porta ssh personalizados em seu arquivo de configuração ssh (~ / .ssh / config) do que especificá-los para cada comando. Pode ser especificado globalmente, por host ou para uma expressão regular que corresponda ao nome do host.
sneak
Como definir portas individualmente para origem e destino?
Brethlosze 18/06
3

se você tiver um servidor de destino mais antigo como eu, não poderá usar

--remove-source-files

mas você tem que usar

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

em vez de.

andrej
fonte
3

Se não for um problema em duas etapas, você poderá scpcopiar o arquivo do servidor remoto e executar ssh -e "rm /path/to/file"para remover do disco. Ao mover arquivos, especialmente entre máquinas, as coisas podem dar errado; portanto, pode ser bom executar a cópia e a exclusão separadamente, e somente remova o arquivo quando tiver certeza de que foi copiado com êxito primeiro.

Giannis
fonte