On Unix-like operating systems, the cp command makes copies of files and directories.

This page describes the GNU/Linux version of cp.

Description

The general form of the command is cp source destination, for example:

  • Description

  • Syntax

  • Options

  • Version control

  • Examples

  • Related commands

  • Linux commands help

  • Options

  • Version control

cp myfile.txt myfilecopy.txt

Like many core Linux commands, if the cp command is successful, by default, no output is displayed. To view output when files are copied, use the -v (verbose) option.

By default, cp will overwrite files without asking. If the destination file name already exists, its data is destroyed. If you want to be prompted for confirmation before files are overwritten, use the -i (interactive) option.

Syntax

cp [option]… [-T] source destination

cp [option]… source… directory

cp [option]… -t directory source…

cp –help

cp –version

Options

By default, sparse source files are detected by a crude heuristic and the corresponding destination file is made sparse as well. That is the behavior selected by –sparse=auto. Specify –sparse=always to create a sparse destination file whenever the source file contains a long enough sequence of zero bytes. Use –sparse=never to inhibit creation of sparse files.

When –reflink[=always] is specified, cp performs a lightweight copy, where the data blocks are copied only when modified. If this is not possible, the copy fails; or, if –reflink=auto is specified, cp falls back to a standard copy operation.

Version control

When using -b/–backup, the backup suffix is ‘~’, unless set with –suffix or SIMPLE_BACKUP_SUFFIX. The version control method may be selected via the –backup=control option or through the VERSION_CONTROL environment variable. The possible values of control or VERSION_CONTROL are:

As a special case, cp makes a backup of source when the force and backup options are given and source and destination are the same name for an existing, regular file.

Examples

Let’s say you have a file named picture.jpg in your working directory, and you want to make a copy of it called picture-02.jpg. You would run the command:

cp picture.jpg picture-02.jpg

…and the file is copied. Here, picture.jpg is the source of the copy operation, and picture-02.jpg is the destination. Both files now exist in your working directory.

The source and destination files may also reside in different directories. For instance,

cp /home/chuck/pictures/picture.jpg /home/chuck/backup/picture.jpg

…makes a copy of the file /home/chuck/pictures/picture.jpg in the directory /home/chuck/backup. The destination file is also named picture.jpg.

If you are the user chuck, you can abbreviate your home directory ("/home/chuck") using a tilde ("~"). For instance,

cp ~/pictures/picture.jpg ~/backup/picture.jpg

…functions the same as the above command when it is run by chuck.

Copying multiple files to a directory

Or, perhaps you want to copy multiple files into another directory. To accomplish this, you can specify multiple files as the source, and a directory name as the destination. Let’s say you are the user sally, and you have a bunch of files in the directory /home/sally/pictures/ named picture-01.jpg, picture-02.jpg, etc. and you want to copy them into the directory /home/sally/picture-backup/. This command will do the trick:

cp ~/pictures/picture-*.jpg ~/picture-backup

Here, we use a wildcard (the asterisk, “*”) to indicate that the source files are all the files in the directory /home/sally/pictures whose name starts with “picture-” and has the extension “.jpg”. They are copied into the directory /home/sally/picture-backup, assuming that directory already exists. If it doesn’t exist, cp gives you an error message, and no files are copied.

You can also specify multiple source files one after the other, and cp will expect that the final argument is a directory name, and copy them all there. For instance,

cp ~/pictures/picture-01.jpg ~/pictures/picture-02.jpg ~/picture-backup

…will copy only those two files, /home/sally/picture-01.jpg and /home/sally/picture-02.jpg, into the directory /home/sally/picture-backup.

Copying files recursively

You can use cp to copy entire directory structures from one place to another using the -R option to perform a recursive copy. Let’s say you are the user steve and you have a directory, /home/steve/files, which contains many files and subdirectories. You want to copy all those files, and all the subdirectories (and the files and subdirectories they contain), to a new location, /home/steve/files-backup. You can copy all of them using the command:

cp -R ~/files ~/files-backup

…and the entire directory structure is copied to the directory /home/steve/files-backup. When performing a recursive copy:

  • If the directory files-backup already exists, the directory files are placed inside.
  • If files-backup does not already exist, it will be created and the contents of the files directory is placed inside it.

Another useful trick is to use cp to create symbolic links to your source files. You may already be familiar with using the ln command to create symlinks; cp is a great way to create multiple symlinks all at once.

cp creates symbolic links if you specify the -s option. So, for instance,

cp -s file.txt file2.txt

…creates a symbolic link, file2.txt, which points to file.txt.

You can also create symbolic links from multiple source files, specifying a directory as the destination.

Let’s say you are user melissa and you have a set of files, file01.txt, file02.txt, etc. in the directory /home/melissa/myfiles. You want to create symbolic links to these files in the existing directory /home/melissa/myfiles2. This command will do the trick:

To create symbolic links in another directory, cp needs you to specify the full pathname, including the full directory name, in your source file name(s). Relative paths will not work.

cp -s ~/myfiles/file*.txt ~/myfiles2

The directory myfiles2 now contain symbolic links to the file*.txt in the directory /home/melissa/myfiles. The myfiles2 directory must already exist for the operation to succeed; if it doesn’t exist, cp gives you an error message and nothing is copied.

This will work with a recursive copy, as well. So the command:

cp -R -s ~/myfiles ~/myfiles2

…will re-create the directory structure of /home/melissa/myfiles, including any subdirectories and their contents; any files are created as symlinks to the originals, but the directories are not symbolic links, only regular directories. If myfiles2 already exists, cp creates a directory inside it called myfiles which contains the directory structure and symlinks; if myfiles2 does not already exist, it is created, and contain the subdirectories and symlinks to the files that myfiles contains.

There are other options you can provide to cp that affect its behavior. These are listed, with the precise command syntax, in the following sections.

Make a copy of a file into the same directory

cp origfile newfile

Creates a copy of the file in the working directory named origfile. The copy is named newfile, and is located in the working directory.

If you want to be prompted before overwriting a file, use the -i (interactive) option. For example:

If the destination file newfile already exists, it is overwritten without a confirmation prompt. This is the default behavior for all cp operations.

cp -i oldfile newfile

If newfile already exists, you are prompted:

cp: overwrite ‘newfile’?

If you type y (or yes, Y, YES, or any other combination of upper and lowercase of these), then newfile is overwritten with a copy of origfile. Typing anything else will abort the operation.

Copy a file into another directory

cp origfile /directory/subdirectory

Creates a copy of the file in the working directory named origfile. The copy is located in the directory /directory/subdirectory, and is named origfile.

cp origfile /directory/subdirectory/.

Same as the above command. The slash-dot (/.) is implied in the above form of the command. (The dot is a special file in every Linux directory which means “this directory.”)

Copy a file into another directory, and give it a new name

cp origfile /directory/subdirectory/newfile

Creates a copy of the file in the working directory named origfile. The copy is named newfile, and is located in the directory /directory/subdirectory.

Copy multiple files into another directory, using a wildcard

cp file* /directory/subdirectory

Copy every file in the working directory whose name begins with file into the directory /directory/subdirectory. The asterisk ("*") is a wildcard — a special character which expands to match other characters. Specifically, the asterisk wildcard matches zero or more non-whitespace characters. For instance, this command will copy any files named file, file001, file.txt, fileone.jpg, file-archive.zip, etc.

cp file*.jpg /directory/subdirectory

Copy every file in the working directory whose name begins with file, and ends with the file extension .jpg. For instance, it would make copies of any files named file, file001.jpg, file002.jpg, or file-new.jpg, etc. The copies are placed into the directory /directory/subdirectory.

Copy an entire directory structure to another location

cp -R /one/two /three/four

Copy the directory two (located in the directory /one), and everything two contains, into the destination directory /three/four. The result is called /three/four/two. The directory /three must already exist for the command to succeed. If the directory four does not already exist in the directory /three, it is created.

cp file1.txt newdir

Copies the file1.txt in the working directory to the newdir subdirectory.

cp /home/public_html/mylog.txt /home/public_html/backup/mylog.bak

Copies the file mylog.txt in the public_html directory into the public_html/backup directory as mylog.bak.

cp -u *.txt newdir

Copy all files ending in .txt into the newdir directory, but only if the files do not already exist in the new directory, or if the files being copied are newer.

cp -R /home/hope/files/* /home/hope/backup

Recursively copies all the files, directories, and subdirectories in the /home/hope/files directory into the /home/hope/backup directory. If the directory backup does not exist in the directory /home/hope, it is created.

cp –backup origfile newfile

If newfile already exists, make a backup of the existing newfile before overwriting it with a copy of origfile. By default, the backup of newfile is named newfile~.

cp –backup=numbered origfile newfile

If newfile already exists, make a backup of the existing newfile before overwriting it with a copy of origfile. The backup of newfile is named newfile.~1~ if no other backup exists, or newfile.~2~ if newfile.~1~ exists, etc.

dd — Copy and convert the encoding of files.ln — Create a link, or a symbolic link, to a file or directory.mv — Move files and directories from one location to another, and optionally rename them.