Take the 2-minute tour ×
Server Fault is a question and answer site for professional system and network administrators. It's 100% free, no registration required.

How to not copy but move files from one server to another (both Linux)?

man scp didn't give me anything useful. I cannot use 'scp' then 'rm' because I must make sure the file is successfully transferred. If there is any error during transfer, the file must not be deleted.

Perhaps I should use exit code somehow, but how? Also, there are a lot of files, and if the last file fails it would be not-so-good option keep the whole bunch of successfully transferred files.

Maybe there is something besides SCP?

share|improve this question

4 Answers 4

up vote 17 down vote accepted

rsync over ssh is probably your best bet with the --remove-source-files option

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

a quick test gives;

[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

As @SvenW mentioned, -e ssh is the default so can be omitted.

share|improve this answer
2  
-e ssh is the implicit default for many years now, there is usually no need to use this parameter anymore. –  SvW Feb 26 '12 at 20:21
    
@SvenW ah good to know! I don't have much need for rsync day to day as scp supports recursive mode for most purposes. –  Tom H Feb 26 '12 at 20:29
    
After that use this to clean up any empty folders (rsync won't remove them): serverfault.com/a/95935/58568 –  bmaupin Dec 6 '12 at 5:07
    
Just added smv() { rsync -az --remove-source-files "$@"; } to my toolbox. Thank you. –  Rhys Ulerich Jun 3 at 16:13

Use rsync instead of scp:

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

More info with man rsync.

share|improve this answer

This question's been answered just fine, and the answer accepted, but since it's floated to the top of the front page, I thought I'd at least try to answer it more precisely, if less elegantly. Yes, you can use the return code from scp, and I do it often. In bash:

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

I take your point about multiple files to copy and handling failure down the stack correctly, so for multiple files:

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

This last is only practical if you're using ssh-agent, but I very much hope you are.

share|improve this answer

in my situation ,ssh port is not 22, so

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

works for me.

share|improve this answer
    
You are much better off putting custom ssh port numbers into your ssh config file (~/.ssh/config) than specifying them for every command. It can be specified globally, per-host, or for a regular expression matching the hostname. –  sneak Sep 26 at 18:42

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.