Server Fault is a question and answer site for system and network administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Now I can only copy a single tar file,how can I copy directories recursively with scp?

share|improve this question
up vote 432 down vote accepted

Yup, use -r:

scp -rp sourcedirectory user@dest:/path
  • -r means recursive
  • -p preserves modification times, access times, and modes from the original file.
share|improve this answer
+1 for explaining each option. – Josh Pinter Jul 15 '15 at 16:52
However bear in mind that this won't preserve symlinks. – CpnCrunch Jul 24 '15 at 0:30

While the previous answers are technically correct, you should also consider using rsync instead. rsync compares the data on the sending and receiving sides with a diff mechanism so it doesn't have to resend data that was already previously sent.

If you are going to copy something to a remote machine more than once, use rsync. Actually, it's good to use rsync every time because it has more controls for things like copying file permissions and ownership and excluding certain files or directories. In general:

$ rsync -av /local/dir server:/remote/dir

will synchronize a local directory with a remote directory. If you run it a second time and the contents of the local directory haven't changed, no data will be transferred - much more efficient than running scp and copying everything every time.

Also, rsync allows you to recover from interrupted transfers very easily, unlike scp.

Finally, modern versions of rsync by default run over ssh, so if scp is already working, rsync should pretty much be a drop-in replacement.

share|improve this answer
"no data will be transferred" except, of course, the data required to determine exactly what has or has not changed. – thsutton Apr 29 '11 at 5:15
Ha yeah I glossed that over a bit obviously. We're not talking quantum entanglement here. – Phil Hollenback Apr 29 '11 at 6:01
it's so sad that osx, win7 and not even ubuntu uses something like rsync for their GUI yet. – cregox Apr 29 '11 at 10:24
+1 Very nice, always used scp but will give it a try. – Trollhorn Apr 29 '11 at 16:07
dmourati I did answer his question. I told him a better way to do it. – Phil Hollenback Jan 29 '13 at 21:23

That is what the -r option is for. :)

See the scp man page for more info if needed.

share|improve this answer
+1 always check the manpage first – Puddingfox Apr 29 '11 at 18:50

Recursive Copy Option '-r' (lower case)

scp -r

Which I confuse with the regular local recursive copy option '-R' (upper case)

cp -R
share|improve this answer
I just wanted to point out the difference between cp and scp as -r and -R are not the same.… – Tarun Sep 23 '13 at 14:54

After looking for the recursive copy flag, and successfully used it thanks to this post, I would like to post just a suggestion.

If the case is that you are copying (recursively) a directory. Maybe if the files are sent compressed you could save time in the transfer

What I did in the end was:

local$ tar -czvf local.tar directory/
local$ scp local.tar user@remote:/directory
ssh user@remote
remote$ tar -xzvf local.tar

Hope this helps

share|improve this answer

The best way is to use rsync over SSH

rsync -a -essh /source/ user@dest-server:/dest/

rsync -a -essh user@source-server:/source/ /dest/

My favorites options are -Pazvessh --delete :

  • -a : archive mode (include a lot of default common options, including preserving symlinks)
  • -z : compress
  • -v : verbose : show files
  • -P : show progess as files done/remaining files
  • -e ssh : do rsync in ssh protocol
  • --delete : delete files in the destination that are not anymore in the source
share|improve this answer
All versions of rsync that I have used would use ssh by default, so -essh is unlikely to be needed. And the choice of command used to connect to the remote host is really unrelated to copying recursively. – kasperd Nov 5 '15 at 19:03

If you prefer to pass the user's password as a parameter rather than inputting it interactively, you can use sshpass (sudo apt-get install -y sshpass).


sshpass -p 'remote_password' scp -rp /src/folder myremoteusername@
share|improve this answer

You can recursively copy a directory into a compressed archive with this simple command:

ssh -p 22  'cd /parent/directory && tar zcvf - directory_to_copy' > /destination/on/your/machine/archive_name.tgz

For example, to copy contents of /var/log from to ~/logs.tgz you run:

ssh -p 22  'cd /var && tar zcvf - log' > ~/logs.tgz

You can also extract files on target system by using pipes. This command will copy contents of /var/log at to ~/destination/log on your system:

ssh -p 22  'cd /var && tar zcvf - log' | tar xzf - -C ~/destination

Though to mirror a directory, you probably should use rsync...

share|improve this answer

Your Answer


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.