40

I'm using below command to transfer files cross server

scp -rc blowfish /source/directory/* username@domain.net:/destination/directory

Is there a way to transfer only files modified files just like update command for cp?

mob
  • 5

3 Answers3

67

rsync is your friend.

rsync -ru /source/directory/* username@domain.net:/destination/directory

If you want it to delete files at the destination that no longer exist at the source, add the --delete option.

Flup
  • 8,398
13

Generally one asks for scp because there is a reason. I.e. can't install rsyncd on the target.

files=`find . -newermt "-3600 secs"`

for file in $files
do
       sshpass -p "" scp "$file" "root@$IP://usr/local/www/current/$file"
done
Dave M
  • 4,494
1

Another option:

remote_sum=$(ssh ${remote} sha256sum ${dest_filename})
remote_sum=${remote_sum%% *}
local_sum=$(sha256sum ${local_filename})
local_sum=${local_sum%% *}
if [[ ${local_sum} != ${remote_sum} ]]; then
  scp ${local_filename} ${remote}:${remote_filename}
fi

This is okay for one file but will be a bit slow for lots of files, depending on how quickly SSH can do repeated connections. If you have controlmasters set up on your SSH connection it might not be too bad. If you need to copy a while directory tree recursively, you could do a single SSH command that does sums on all the files, shove the result into a bash associative array, do the same on the local host, then compare file sums to decide whether to do the copy. But it's almost certainly easier to install rsync on the remote.

Tom
  • 389