Como arquivos _MOVE_ com scp?

40

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

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

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

Talvez haja algo além de SCP?

    
por Putnik 26.02.2012 / 20:11

6 respostas

41

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

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 @SvenW mencionou, -e ssh é o padrão, portanto, pode ser omitido.

    
por 26.02.2012 / 20:15
16

Use rsync em vez de scp :

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

Mais informações com man rsync .

    
por 26.02.2012 / 20:18
15

Esta pergunta foi respondida muito bem, e a resposta foi aceita, mas desde que chegou ao topo da primeira página, eu pensei em pelo menos tentar respondê-la com mais precisão, ainda que com menos elegância. Sim, você pode usar o código de retorno de scp e eu faço isso com frequência. Em bash :

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

Eu entendo o fato de vários arquivos copiarem e lidarem com falhas na pilha corretamente, portanto, para vários arquivos:

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

Esta última é prática apenas se você estiver usando ssh-agent , mas eu espero que você esteja.

    
por 18.04.2013 / 14:23
2

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.

    
por 24.09.2013 / 05:47
2

se você tiver um servidor de destino mais antigo como eu, não será possível usar

--remove-source-files

mas você tem que usar

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

em vez disso.

    
por 23.01.2015 / 17:23
2

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

    
por 01.07.2016 / 08:39