901

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?

1357

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.

| improve this answer | |
  • @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 5 '14 at 11:09
  • @Funzies: probably your command should be: cp -a ~/Downloads/textext/. ~/.config/inkscape/extensions/ – enzotib Feb 6 '14 at 7: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 2:31
  • 4
    @DylanValade: -a already implies --preserve=all, that is wider than -p = --preserve=mode,ownership,timestamps. – enzotib Dec 22 '14 at 16:22
  • 1
    @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 9 '15 at 13:46
155

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.
| improve this answer | |
  • 5
    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 4:42
  • 1
    This will not copy hidden files, since bash expands * only to non-hidden file. The solution by @Joschua is safer. – sauerburger Mar 9 '17 at 23:00
  • 2
    If it's a big folder you may wish to use one of these options to view progress while it's copying askubuntu.com/questions/609303/… – Matthew Lock Nov 13 '18 at 5:19
94

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.

| improve this answer | |
  • 6
    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
  • 6
    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
  • 3
    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
16

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
| improve this answer | |
  • 3
    This isn't what the question asks. – AStopher Mar 8 '15 at 13:18
  • (Using -r with -a is redundant; on gnu cp -a is the same as "-dr --preserve=all") – cristoper Feb 14 '18 at 16:35
  • 1
    cp: the -R and -r options may not be specified together. – IgorGanapolsky Dec 19 '18 at 23:07
10

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.

| improve this answer | |
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).

| improve this answer | |
0

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
| improve this answer | |

Not the answer you're looking for? Browse other questions tagged or ask your own question.