rsync
is basically the only copy command you'll ever need on a linux/unix system. It can copy in the same machine or across machines. It can retain file permissions and owners. You can run it over and over again say if the first execution failed or if there are new files to be copied over.
rsync -av fromdir/ todir/
Will copy the contents of fromdir/
to the directory todir/
To make a little example, some fancy bash syntax for creating a directory structure.
$ mkdir -p one/{green,blue}/{square,circle}{1..3} $ find . . ./one ./one/blue ./one/blue/circle1 ./one/blue/circle2 ./one/blue/circle3 ./one/blue/square1 ./one/blue/square2 ./one/blue/square3 ./one/green ./one/green/circle1 ./one/green/circle2 ./one/green/circle3 ./one/green/square1 ./one/green/square2 ./one/green/square3
So to copy one
to a new directory two
we just do this
rsync -av one/ two/
Which gives us this as output
$ rsync -av one/ two/ building file list ... done created directory two ./ blue/ blue/circle1/ blue/circle2/ blue/circle3/ blue/square1/ blue/square2/ blue/square3/ green/ green/circle1/ green/circle2/ green/circle3/ green/square1/ green/square2/ green/square3/ sent 301 bytes received 110 bytes 822.00 bytes/sec total size is 0 speedup is 0.00
Now we have the following directory structure:
$ find . . ./one ./one/blue ./one/blue/circle1 ./one/blue/circle2 ./one/blue/circle3 ./one/blue/square1 ./one/blue/square2 ./one/blue/square3 ./one/green ./one/green/circle1 ./one/green/circle2 ./one/green/circle3 ./one/green/square1 ./one/green/square2 ./one/green/square3 ./two ./two/blue ./two/blue/circle1 ./two/blue/circle2 ./two/blue/circle3 ./two/blue/square1 ./two/blue/square2 ./two/blue/square3 ./two/green ./two/green/circle1 ./two/green/circle2 ./two/green/circle3 ./two/green/square1 ./two/green/square2 ./two/green/square3
There's a strange thing when not using the slashes at the end. To keep things sane, just always use the slashes at the end of the two file paths and things will always be easy to remember.