How to _MOVE_ files with 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.
Solution 4
If doing it in two steps is not a problem, you can use scp
to copy the file from the remote server, and then execute ssh -e "rm /path/to/file"
to remove from disk. When moving files especially between machines things may go wrong, so it may be good to perform the copy and the delete separately, and only remove the file when you know for sure that it has been successfully copied first.
Solution 5
if you have older target server as I do, you can't use
--remove-source-files
but you have to use
--remove-sent-files --protocol=29
instead.
Related videos on Youtube
Putnik
AWS Certified Solutions Architect-Associate AWS Certified SysOps Administrator-Associate 10+ years with Linux etc :) Feel free to contact me via LinkedIn https://www.linkedin.com/in/alexander-lutchko-11b556b7/
Updated on September 18, 2022Comments
-
Putnik over 1 year
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?
-
FooBee about 12 years
-e ssh
is the implicit default for many years now, there is usually no need to use this parameter anymore. -
gokva about 12 years@SvenW ah good to know! I don't have much need for rsync day to day as scp supports recursive mode for most purposes.
-
bmaupin over 11 yearsAfter that use this to clean up any empty folders (rsync won't remove them): serverfault.com/a/95935/58568
-
Rhys Ulerich almost 10 yearsJust added
smv() { rsync -az --remove-source-files "$@"; }
to my toolbox. Thank you. -
sneak over 9 yearsYou 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.
-
valentt over 7 yearsWhat if you don't have rsync? For example OpenWrt doesn't have rsync and I need to use scp to move files. What to do now?
-
Travis Griggs about 7 yearsI feel this should have been the answer. It answers the question asked precisely.
-
Brethlosze almost 7 yearsHow to set ports individually both for source and destination?
-
Moonchild over 6 yearsAs SCP doesn't handle (AFAIK) bandwith limitation, I used your hanswer with rsync to move files one by one at a defined bandwith. Thanks !
-
Spencer D over 6 years@Moonchild, scp actually can handle bandwidth limits using the
-l
flag. E.g.,-l 8192
to limit transfers at 8192 kb/s -
k_o_ almost 3 years
-e ssh
is still useful for passing a specific authentication key-e "ssh -i mykey.pem"