Currently I can only copy a single .tar
file. But how can I copy directories recursively with scp
?
9 Answers
Yup, use -r
:
scp -rp sourcedirectory user@dest:/path
- -r means recursive
- -p preserves modification times, access times, and modes from the original file.
Note: This creates the sourcedirectory
inside /path
thus the files will be in /path/sourcedirectory
- 157
- 1
- 8
- 24,720
- 2
- 40
- 69
-
11However bear in mind that this won't preserve symlinks. – CpnCrunch Jul 24 '15 at 00:30
-
28Note that `-pr` (options in reversed order) won't copy the folders, bur rather their content to the target directory (apparently, the order of options matters). – pms Feb 03 '17 at 14:49
-
If I do a ./ to do the current directory it says Error: unexpected file name. I know I can go to the parent directory and do it that way, or use globing with *. However, I am curious why ./ would not work for the source directory? – Andrew S Feb 09 '21 at 19:17
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.
- 103
- 4
- 14,647
- 4
- 34
- 51
-
1I agree `rsync` is more efficient. One thing it doesn't currently do that `scp` does is allow copying between remote hosts (at least without running the rsync client on one of them). – Cedric Knight Aug 21 '17 at 08:54
-
4`-av` :v is for verbose, a for archive and is a shortcut to -rlptgoD which implies recursive , preserve rights owner dates and links. If you only want recursive use `-r` – pdem Sep 26 '19 at 12:57
-
1rsync does not encrpyt traffic, so you need to use extra "-e ssh" to encrypt the traffic like scp – Pozzo-Balbi Jul 22 '20 at 23:09
-
That is what the -r
option is for. :)
See the scp man page for more info if needed.
- 523
- 3
- 9
Recursive Copy Option '-r' (lower case)
scp -r
Which I confuse with the regular local recursive copy option '-R' (upper case)
cp -R
- 301
- 2
- 3
-
5I just wanted to point out the difference between cp and scp as -r and -R are not the same. http://unix.stackexchange.com/questions/18712/difference-between-cp-r-and-cp-r-copy-command – Tarun Sep 23 '13 at 14:54
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
- 715
- 6
- 7
-
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 05 '15 at 19:03
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.gz directory/
local$ scp local.tar.gz user@remote:/directory
ssh user@remote
remote$ tar -xzvf local.tar.gz
Hope this helps
- 203
- 2
- 7
-
the file extension should be either `.tar.gz` or `.tgz` since the file is a gzipped tar archive (since the `-z` flag is used). – anthonybell Mar 26 '18 at 22:07
You can recursively copy a directory into a compressed archive with this simple command:
ssh -p 22 user@address-to-copy-from.com 'cd /parent/directory && tar zcvf - directory_to_copy' > /destination/on/your/machine/archive_name.tgz
For example, to copy contents of /var/log
from domain.com
to ~/logs.tgz
you run:
ssh -p 22 user@domain.com '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 domain.com
to ~/destination/log
on your system:
ssh -p 22 user@domain.com 'cd /var && tar zcvf - log' | tar xzf - -C ~/destination
Though to mirror a directory, you probably should use rsync
...
- 3,597
- 17
- 23
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
).
Example:
sshpass -p 'remote_password' scp -rp /src/folder myremoteusername@122.10.12.123:/dest/folder
- 940
- 1
- 12
- 28
You can use -r option with scp command to copy directories recursively on any system. If you need anything else refer scp command tutorial. -r option stands for recursive operation in most of the Linux commands.
- 31
- 1
-
2While true, the `-r` option has already been suggested years ago and is the accepted answer. – RalfFriedl Apr 22 '19 at 16:05