I just noticed a Superuser question with ~80000 views where people were still generally-clueless about a commandline trick with file-copying. As there was only a slight variation of this mentioned, I’m going to share it here.
So, the following command can be interpreted two different ways:
$ cp -r dir1 dir2
- If
dir2
exists, copydir1
intodir2
asbasename(dir1)
. - If
dir2
doesn’t exist, copydir1
intodirname(dir2)
and name itbasename(dir1)
.
What if you want to always copy the contents of dir1
into dir2
? Well, you’d do this:
$ cp -r dir1/* dir2
However, this will ignore any hidden files in dir1
. Instead, you can add a trailing slash to dir1
:
$ cp -r dir1/ dir2
This will deterministically pour the contents of dir1
into dir2
.
Example:
/tmp$ mkdir test_dir1 /tmp$ cd test_dir1/ /tmp/test_dir1$ touch aa /tmp/test_dir1$ touch .bb /tmp/test_dir1$ cd .. /tmp$ mkdir test_dir2 /tmp$ cp -r test_dir1/* test_dir2 /tmp$ ls -1a test_dir2 . .. aa /tmp$ cp -r test_dir1/ test_dir2 /tmp$ ls -1a test_dir2 . .. .bb aa
The Superuser question insisted that you needed a period at the end of the from argument which isn’t accurate (but will still work).