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
dir2exists, copydir1intodir2asbasename(dir1). - If
dir2doesn’t exist, copydir1intodirname(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).