How to _MOVE_ files with scp?
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?
Solution 1:
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.
Solution 2:
Use rsync
instead of scp
:
rsync -avz --remove-source-files /sourcedir user@host:/targetdir
More info with man rsync
.
Solution 3:
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.