1317

I am trying to copy the contents of a folder to another folder in a different directory using terminal.

Would somebody be able to provide me an example of the command line syntax required to achieve this?

Seth
  • 58,122
pandisvezia
  • 13,391
  • 3
  • 16
  • 7

8 Answers8

1961

You can copy the content of a folder /source to another existing folder /dest with the command

cp -a /source/. /dest/

The -a option is an improved recursive option, that preserve all file attributes, and also preserve symlinks.

The . at end of the source path is a specific cp syntax that allow to copy all files and folders, included hidden ones.

enzotib
  • 93,831
  • @enzotib I am trying to use this command to copy the contents of "Downloads/textext" to "~/.config/inkscape/extensions/." Using your command I type "cp -a /Downloads/textext/. /~/.config/inkscape/extensions/." but this does not work – Funzies Feb 05 '14 at 11:09
  • @Funzies: probably your command should be: cp -a ~/Downloads/textext/. ~/.config/inkscape/extensions/ – enzotib Feb 06 '14 at 07:58
  • Add -p flag as to preserve the file permissions and timestamps. cp -ap /var/www/original.com/images/. /var/www/new.com/images/ – Dylan Valade Dec 17 '14 at 02:31
  • 7
    @DylanValade: -a already implies --preserve=all, that is wider than -p = --preserve=mode,ownership,timestamps. – enzotib Dec 22 '14 at 16:22
  • Note: If you directory name contains spaces, then you need to quote the arguments like cp -a /media/ubuntu/Volume/. '/media/ubuntu/My Passport/'. And if you want to encrypt your files, then you can use the scp (Secure Copy) command. – Benny Code Jul 09 '15 at 11:13
  • 2
    @BennyNeugebauer: scp is used to copy over a network (through ssh) and only encrypts the communication channel, not the files on the destination filesystem. – enzotib Jul 09 '15 at 13:46
  • @PawelCioch: cp -r is recursive copy, -a add some other option, like --preserve=all – enzotib May 04 '16 at 20:21
  • I'd suggest prepending the folder paths in the answer with . so the command will work in the local directory, just not to confuse the begginers – Anton Kastritskiy Jun 07 '16 at 16:00
  • 1
    Such a great answer! The -a option even set up git in my destination directory. – Muhammad Ali Mar 23 '17 at 15:10
  • What I like about -a is that it preserves symlinks. What I don't like is that it copies recursively (including the sub-folders, which is not what cp usually does). How can I preserve symlinks without copying sub-folders recursively? – user1271772 Apr 09 '17 at 20:03
  • @user1271772: to preserve symlinks without recursing directories you need cp -d, you may also add --preserve=all – enzotib Apr 10 '17 at 06:43
  • The mv command does not list the -a flag. Could the cp move files instead of copying them with another flag? – emagar Apr 21 '18 at 08:58
  • One cannot always presume rsync is installed, so it is important to know how to achieve similar with GNU cp. Thanks. – Felipe Alvarez Apr 13 '19 at 07:47
  • 5
    "The . at end of the source path is a specific cp syntax that allow to copy all files and folders, included hidden ones.", this is not related to cp, but related to bash. The dot means "this location" and avoids the use of bash globbing, where by default files/directories starting with a . are not expanded. – Bruno Pereira Sep 05 '19 at 12:13
  • 2
    @BrunoPereira: my sentence is wrong, but I think bash has nothing to do with this. It is UNIX that indicates the current directory with a dot, and cp, when given two directories path/foo and bar as arguments and a recursive option, like -a, creates a new directory foo under bar and copies all files contained in path/foo under bar/foo. If bar/foo already exists, the creation step is skipped. This is what happens here, given that dest/. already exists. – enzotib Sep 07 '19 at 16:15
  • I would suggest yes | cp -a /source/. /dest/ to accept the replacing – Ali Oct 04 '20 at 17:15
  • @enzotib Following up on Bruno Pereira's thread, could you edit your answer to remove the part about "specific cp syntax"? I think it's a bit misleading. Otherwise, it's a great answer. – flow2k Nov 16 '20 at 22:18
  • this gives me /dest/source/ i just want the contents of /source/ not the folder itself :( – CpILL Nov 29 '20 at 23:21
  • I think it should be noted that if the destination folder already exists, it and its contents might be overwritten by cp. (https://unix.stackexchange.com/questions/275969/does-cp-a-refresh-existing-files-overwrite-or-skip) – intagli Dec 17 '20 at 18:34
  • I want to copy a fonts files from a source software to .fonts in home, and for my working: cp -a fonts/. ~/.fonts/Shutter-Encoder – Indacochea Wachín Oct 11 '21 at 19:41
  • 1
    Can someone explain the need behind use of mypath/. instead of the existing bash wildcard expansion character, mypath/*? – Elysiumplain Apr 07 '22 at 01:39
  • 1
    @Elysiumplain: you missed the "included hidden files" part – enzotib Apr 07 '22 at 06:35
199

An alternate is rsync:

rsync -a source/ destination

The advantages of rsync are:

  1. After the initial sync, it will then copy only the files that have changed.
  2. You can use it over a network, convenient for files in $HOME, especially config files.
Nowaker
  • 105
  • 4
Panther
  • 102,067
  • 7
    I think you don't need the asterisk. rsync -r source/ destination should be enough, no? – Joschua Dec 17 '15 at 15:10
  • 1
    This one is more appropriate: 'rsync -rtvp source/* destination' – Shridutt Kothari Sep 16 '16 at 14:14
  • -r not works for hidden files/folders – Nam G VU Sep 21 '16 at 04:42
  • 1
    This will not copy hidden files, since bash expands * only to non-hidden file. The solution by @Joschua is safer. – sauerburger Mar 09 '17 at 23:00
  • rsync will copy the entire directory, including hidden files, if you use the trailing / without a * so rync source/ dest Obviously people will need to customize the rsync command to function as they wish. – Panther Mar 10 '17 at 16:40
  • I rather the verbose and all option: rsync -av source/ destination – Katu Aug 22 '17 at 13:38
  • You can use the --delete flag to delete files from destination that aren't in source – Alex Varga Aug 29 '17 at 17:49
  • Is the rsync command faster than CP? IT is doing like one 10 KB text file per 10 seconds. – Mark Deven Aug 24 '18 at 16:16
  • I dont know , but it will only transfer new or changed files so will be simple to script – Panther Aug 24 '18 at 16:24
  • 2
    If it's a big folder you may wish to use one of these options to view progress while it's copying https://askubuntu.com/questions/609303/how-can-i-view-a-progress-bar-when-running-rsync – Matthew Lock Nov 13 '18 at 05:19
  • What if in source directory i will remove something after init sync, and run again sync? It will be removed also in destination, or only new things will be copied? – unbreak Mar 25 '20 at 21:23
  • The OP asks "copy the contents of a folder to another folder". Removing the asterisk means we now copy the folder itself, which isn't the right answer when we wish to retain the target (e.g. because it's a drive or has existing content). – c z Oct 30 '20 at 09:27
129

Lets say you have a folder called folder1 in your ~, inside folder1 is 1 file called file1 and 2 folders called sub1 and sub2 each with other files and folders inside them.

To copy all the contents of ~/folder1 to ~/new_folder1 you would use

cp -r ~/folder1/. ~/new_folder1

new_folder1 would then contain all the files and folders from folder1.

cp is the command to copy using a terminal, -r makes it recursively (so, current directory + further directories inside current) ~/folder1 is the origin folder, ~/new_folder1 is the destination folder for the files/folders inside the origin.

Bruno Pereira
  • 73,643
  • 7
    it does not catch hidden files – Portablejim Dec 11 '11 at 13:04
  • 1
    Thank you Bruno! It helped me to understand the syntax, though I had to change it a bit(removing ~ sign). Maybe because the destination folder was in /opt, which resides in another file system. And thank you Portablejim to remember the hidden file thing! – pandisvezia Dec 11 '11 at 15:51
  • 7
    The trailing period is important. Without it, sometimes it may create a new subdirectory ~/new_folder1/folder1 instead of copying the contents over. – wisbucky Jan 19 '15 at 23:00
  • 5
    Why not cp -r ~/folder1/* ~/new_folder1 – Alex78191 Jul 24 '18 at 10:59
  • @Alex78191 [root@ home]# mkdir food [root@ home]# cd food/ [root@ food]# mkdir .fruit [root@ food]# mkdir veggies [root@ food]# touch veggies/carrots [root@ food]# touch .fruit/apple [root@ food]# ls * carrots [root@ food]# – Bruno Pereira Jul 24 '18 at 11:19
  • @Alex78191 Why do we use * vs . ?

    cp -a /source/. /dest/

    vs.

    cp -r ~/source/* ~/dest/

    – HeggyHere Dec 22 '18 at 07:15
  • @HeggyHere why? – Alex78191 Dec 25 '18 at 21:38
  • I'm still getting ~/folder1/new_folder1/, period doesn't seem to have an effect? Which version of bash does this work for? – CpILL Nov 29 '20 at 23:24
51

Simple example.

Copy the directory dir_1 and its contents (files) into directory dir_2:

cp -r ./dir_1 ./dir_2
# or
cp -r ./dir_1/ ./dir_2/
# Results in: ./dir_2/dir_1/_files_

Copy only the contents (files) of dir_1 into directory dir_2:

cp -r ./dir_1/. ./dir_2
# or
cp -r ./dir_1/. ./dir_2/
# Results in: ./dir_2/_files_

_files_ is a placeholder for the actual files located in the directory.

25

Check this http://www.cyberciti.biz/faq/copy-folder-linux-command-line/ for more information on copying folder. Hope this helps.

cp Command

cp is a Linux command for copying files and directories. The syntax is as follows:

cp source destination
cp dir1 dir2
cp -option  source destination
cp -option1 -option2  source destination

In this example copy /home/vivek/letters folder and all its files to /usb/backup directory:

cp -avr /home/vivek/letters /usb/backup

Where,

-a : Preserve the specified attributes such as directory an file mode, ownership, timestamps, if possible additional attributes: context, links, xattr, all.

-v : Explain what is being done.

-r : Copy directories recursively. Example

Copy a folder called /tmp/conf to /tmp/backup:

$ cp -avr /tmp/conf/ /tmp/backup
Dilip Rajkumar
  • 387
  • 3
  • 5
6

This code with Flag "-R" copies perfectly all the contents of "folder1" to existing "folder2":

cp -R folder1/. folder2

Flag "-R" copies symbolic links as well but Flag "-r" skips symbolic links so Flag "-R" is better than Flag "-r".

  • The latest GNU Grep 3.7:
-R, --dereference-recursive

For each directory operand, read and process all files in that directory, recursively, following all symbolic links.

-r, --recursive

For each directory operand, read and process all files in that directory, 
recursively. Follow symbolic links on the command line, but skip symlinks 
that are encountered recursively. Note that if no file operand is given, 
grep searches the working directory. This is the same as the 
‘--directories=recurse’ option.
5

I like this command

rsync -av --progress ~/code/project-source/. ~/code/project-destination --exclude .git --exclude node_modules

Some of the commonly used options in rsync command are listed below:

  • -v, –verbose: Verbose output
  • -q, –quiet: suppress message output
  • -a, –archive: archive files and directory while synchronizing ( -an equal to following options -rlptgoD)
  • -r, –recursive: sync files and directories recursively
  • -b, –backup: take the backup during synchronization
  • -u, –update: don’t copy the files from source to destination if destination files are newer
  • -l, –links: copy symlinks as symlinks during the sync
  • -n, –dry-run: perform a trial run without synchronization
  • -e, –rsh=COMMAND: mention the remote shell to use in rsync
  • -z, –compress: compress file data during the transfer
  • -h, –human-readable: display the output numbers in a human-readable format
  • –progress: show the sync progress during transfer
zarpio
  • 343
3

If there are two folders: (with write permission)

drwxr-xr-x 4 vimal vimal  4096 Sep  9 12:17 .
drwxr-xr-x 3 root  root   4096 Aug 18 14:35 ..
drwxrwxrwx 6 vimal vimal  4096 Sep  9 12:15 DATA
drwxrwxrwx 7 vimal vimal  4096 Sep  9 12:15 PORTAL

If you are inside the folder called PORTAL where you want to copy all content of another folder say DATA at the same level then you will do

vimal@vimal-D3H:/var/www/html/PORTAL$ cp -a ../DATA/. .

You have to notice 2 dots. Last dot says copy here in present folder

and

one following /DATA/. says that all the CONTENTS inside DATA folder to be copied, and not the DATA folder itself.

If you remove this trailing "." from /DATA/

then whole DATA folder will be copied inside PORTAL(from where you are coping).