- Linux cp command
- Description
- Syntax
- Options
- Version control
- Examples
- Copying multiple files to a directory
- Copying files recursively
- Creating symbolic links instead of copying data
- Make a copy of a file into the same directory
- Copy a file into another directory
- Copy a file into another directory, and give it a new name
- Copy multiple files into another directory, using a wildcard
- Copy an entire directory structure to another location
- Related commands
Linux cp command
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:
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. 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.
Options
-a, —archive | Same as -dR —preserve=ALL. When performing the copy, attempt to preserve as much of the original file structure, attributes, and associated metadata as possible. This metadata includes security context data if you are running SELinux. |
—attributes-only | Don’t copy the file data, only create a file with the same attributes. If the destination file already exists, don’t alter its contents. You can control exactly which attributes are copied with the —preserve option. |
—backup[=control] | Make a backup of each existing destination file that would otherwise be overwritten or removed. The control parameter specifies what version control method to use; see version control for details. |
A sparse file contains «holes», where a hole is a sequence of zero bytes that occupies no physical disk space. When the file is read, the holes are read as zeros. This can conserve disk space since many files contain long sequences of zeros. By default, cp detects sparse files and creates sparse destination files as well.
The when parameter defines what cp should do when a source file is detected to be sparse:
The directory representing the mount point itself is copied, but not traversed.
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:
none, off | Never make backups (even if —backup is given). |
numbered, t | Make numbered backups. |
existing, nil | Numbered if numbered backups exist, simple otherwise. |
simple, never | Always make simple backups. |
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:
. 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.
Creating symbolic links instead of copying data
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,
. 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.
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.
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:
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:
. 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
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 the destination file newfile already exists, it is overwritten without a confirmation prompt. This is the default behavior for all cp operations.
To be prompted before overwriting a file, use the -i (interactive) option. For example:
If newfile already exists, you are prompted:
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
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.
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.
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.
Related commands
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.