1522

I want to recursively create a copy of a directory and all its contents (e.g. files and subdirectories).

4

3 Answers 3

2504

The option you're looking for is -R.

cp -R path_to_source path_to_destination/
  • If destination doesn't exist, it will be created.
  • -R means copy directories recursively. You can also use -r since it's case-insensitive.
  • To copy everything inside the source folder (symlinks, hidden files) without copying the source folder itself use -a flag along with trailing /. in the source (as per @muni764's / @Anton Krug's comment):
cp -a path_to_source/. path_to_destination/
Sign up to request clarification or add additional context in comments.

8 Comments

i wonder why this exact command in dockerfile copies all source directory files into destination, instead of copying just whole directory.
I believe the '/' on the end makes a difference and that might account for your experience. If the source includes the trailing slash it will copy what is in the directory only. If it does not include the trailing slash, it will copy the directory as well and then the contents inside of it. My memory is this behavior varies by command and maybe event by OS a bit. Here's a reference with more info.
I would say if you don't want to include the source and you want to make sure everything is copied (symlinks, hidden files) without copying the source parent folder is to use -ra source/. destination. This will make sure the content of the folder is copied, but not the parent folder itself, which is sometimes handy. And the difference is the /.
Note the importance of "Slash dot" on your source in cp -r src/. dest I know it is mentioned but I still seem to miss it every time.
@AntonKrug: Why -ra when -a already includes -r?
|
393

You are looking for the cp command. You need to change directories so that you are outside of the directory you are trying to copy.

If the directory you're copying is called dir1 and you want to copy it to your /home/Pictures folder:

cp -r dir1/ ~/Pictures/

Linux is case-sensitive and also needs the / after each directory to know that it isn't a file. ~ is a special character in the terminal that automatically evaluates to the current user's home directory. If you need to know what directory you are in, use the command pwd.

When you don't know how to use a Linux command, there is a manual page that you can refer to by typing:

man [insert command here]

at a terminal prompt.

Also, to auto complete long file paths when typing in the terminal, you can hit Tab after you've started typing the path and you will either be presented with choices, or it will insert the remaining part of the path.

There is an important distinction between Linux and Unix in the answer because for Linux (GNU and BusyBox) -R, -r, and --recursive are all equivalent, as mentioned in this answer. For portability, i.e. POSIX compliance, you would want to use -R because of some implementation-dependent differences with -r. It's important to read the man pages to know any idiosyncrasies that may arise (this is a good use case to show why POSIX standards are useful).

5 Comments

To clarify further, the -r option in this will copy directories recursively.
Did the OP not specify that he was using the cp -r command, but that it wasn't working properly?
The reason I included the info about manpages is these flags can be distribution dependent. However, for the most part, it appears -r, --recursive, and -R are equivalent. It will also give common pitfalls, etc. which is nice.
If you want to portably copy the DIRECTORY and not just it's contents, leave off the trailing dash in the source folder ie. cp -r dir1 ~/Pictures/
A slash on the end of the src is a BSDism. The GNU Linux equivilent is the -T flag.
115

Use:

$ cp -R SRCFOLDER DESTFOLDER/

1 Comment

this is the way I done it and demo1_copy did not exist already $ ls demo1 demo3 README.md $ cp -R demo1/ demo1_copy/

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.