How can I copy multiple files over scp in one command?
I have to transport a lot of files from one PC to another (both Linux). I would like to use scp
for that, but scp
only allows for transferring one file at a time.
How can I do this?
I have
- No possibility to use rsync or any other protocol
- No possibility to use passphrase-free certificates (but have a certificate with a passphrase)
- A list of files to transfer and a list with the destination path of the files on the other server
- The files are spread out over a lot of directories, and not all the files in the directories I want to copy
If possible, I would like to gzip and ungzip transparently to save bandwidth!
Is this possible?
Use tar
:
tar cvzf - -T list_of_filenames | ssh hostname tar xzf -
I would like to use scp for that, but scp only allows for transferring one file at a time.
I'm pretty sure that isn't true, at least not for the scp
command provided by the OpenSSH included with most Linux distributions.
I use scp file1 file2 ... fileN user@host:/destination/directory/
fairly frequently.
For transparent compression, the SSH protocol has this built in and scp
can use it if you provide the -C
option on the command line. For lots of similar small files you will find the tar+gz option suggested by akira gains better compression as it can make use of similarity between such files where scp
compresses each file as a separate entity. I generally prefer to use scp though as it is easier to resume a partial transfer (or, though I know in this situation the questioner doesn't have the option) rsync
as that is both even easier to resume and shares the tar+gz option's whole-stream compression advantage.
Doesn't scp -r yourdir otherhost:/otherdir
work?
Try this then:
tar cfz - . | ssh otherhost "cd /mydir; tar xvzf -"
the z
-flag to tar does compression. Or you can use -C to ssh:
tar cf - . | ssh -C otherhost "cd /mydir; tar xvf -"