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
-
12
-
36Note 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).– pmsFeb 3, 2017 at 14:49 -
1If 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 SFeb 9, 2021 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.
-
1I agree
rsync
is more efficient. One thing it doesn't currently do thatscp
does is allow copying between remote hosts (at least without running the rsync client on one of them). Aug 21, 2017 at 8: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
– pdemSep 26, 2019 at 12:57 -
1rsync does not encrpyt traffic, so you need to use extra "-e ssh" to encrypt the traffic like scp Jul 22, 2020 at 23:09
That is what the -r
option is for. :)
See the scp man page for more info if needed.
Recursive Copy Option '-r' (lower case)
scp -r
Which I confuse with the regular local recursive copy option '-R' (upper case)
cp -R
-
5I just wanted to point out the difference between cp and scp as -r and -R are not the same. unix.stackexchange.com/questions/18712/…– TarunSep 23, 2013 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
-
All versions of
rsync
that I have used would usessh
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.– kasperdNov 5, 2015 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
-
the file extension should be either
.tar.gz
or.tgz
since the file is a gzipped tar archive (since the-z
flag is used). Mar 26, 2018 at 22:07
You can recursively copy a directory into a compressed archive with this simple command:
ssh -p 22 [email protected] '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 [email protected] '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 [email protected] 'cd /var && tar zcvf - log' | tar xzf - -C ~/destination
Though to mirror a directory, you probably should use rsync
...
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 [email protected]:/dest/folder
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.
-
2While true, the
-r
option has already been suggested years ago and is the accepted answer. Apr 22, 2019 at 16:05