Home Learn Linux How to Use the cp Command in Linux: A Step-by-Step Tutorial

How to Use the cp Command in Linux: A Step-by-Step Tutorial

The cp command is a fundamental tool in Linux for copying files and directories. This beginner's guide demystifies the cp command, providing clear instructions and practical examples to help you master file copying operations, enhance your file management skills, and streamline your workflow in the Linux environment.

by Arun Kumar
cp command linux

In Linux, managing files and directories is an essential part of using the operating system. One of the most commonly used commands for file management is the cp command, which stands for “copy.” The cp command allows users to copy and move files and directories quickly and efficiently. In this guide, we’ll cover the basics of the cp command and how to use it to manage files and directories in Linux.

CP command in Linux

At its core, the cp command is straightforward. It takes one or more source files or directories and copies them to a specified destination. The basic syntax looks like this:

cp [options] source destination

Basic file copying

To start with a simple example, imagine you have a file named hello.txt and you want to copy it to a new file named hello_copy.txt. In your Ubuntu terminal, you would enter:

cp hello.txt hello_copy.txt

After executing this command, you’ll have an exact copy of hello.txt under the new name hello_copy.txt. If you run ls, you should see both files listed:

hello.txt  hello_copy.txt

Copying directories

Copying directories requires the -r (or --recursive) option, which tells cp to copy directories recursively. Say you have a directory named documents and you want to copy it to a new directory named documents_backup. The command would be:

cp -r documents documents_backup

This command creates a documents_backup directory with all the contents of the original documents directory. It’s like cloning the entire folder, subfolders and all.

Options that make life easier

The cp command comes with several options that can make your life easier, and over the years, I’ve come to appreciate some more than others:

  • -v (verbose): This option tells cp to print detailed output, showing files as they are copied. It’s great for monitoring progress or debugging.
  • -i (interactive): With this, cp will prompt you before overwriting any files. It’s a lifesaver when you’re copying a bunch of files and don’t want to accidentally overwrite something important.
  • -u (update): This handy option only copies files that either don’t exist in the destination or are newer than the destination files. It’s perfect for updating backups.

Here’s how you might use these options in a real-world scenario. Let’s say you’re updating a backup and want to see what’s being copied, but you don’t want to overwrite anything without confirmation. The command might look like this:

cp -rivu documents documents_backup

This command recursively copies documents to documents_backup, showing verbose output, prompting before overwriting, and only updating files that have changed.

A note on symbolic links

When copying directories, you might encounter symbolic links. By default, cp copies the links themselves rather than the files they point to. If you prefer to copy the actual files, use the -L option, which dereferences the links. Personally, I find this most useful when I’m archiving or backing up and want the actual files, not just the links.

Advanced uses of the CP command

As you grow more comfortable with the basics of the cp command, you can start exploring some of its more advanced uses. These can significantly enhance your file management and scripting capabilities in Linux.

Preserving context

When working in environments with strict security policies or specialized file system attributes, the --preserve=context option becomes invaluable. This ensures that the SELinux security context is maintained during the copy process, which is crucial for maintaining system security and functionality. For example:

cp --preserve=context secure_file new_secure_file

This command ensures that new_secure_file retains the same SELinux security context as secure_file, avoiding potential security issues.

Backup option

The --backup option is a feature I’ve come to appreciate, especially when automating tasks. It creates a backup of each existing destination file before overwriting it. You can control the backup behavior with additional arguments like none, simple, numbered, and existing. For instance:

cp --backup=numbered original_file destination_folder/

This command copies original_file to destination_folder, and if the file already exists there, cp creates a numbered backup of the existing file before copying. This feature is a lifesaver in scripts where you want to preserve previous versions automatically.

Copying only when the source is newer

Sometimes, you only want to copy files if they’re newer than the destination files. This is particularly useful for synchronizing directories. While the -u option does this to some extent, combining it with the -t option can streamline the process, especially in scripts. The -t option specifies the target directory for the copies:

cp -u -t backup_directory source_directory/*

This command copies all files from source_directory that are newer than those in backup_directory directly into backup_directory, making it a powerful command for incremental backups.

Sparse files handling

Sparse files are a type of file that use storage space more efficiently by not using disk space for “empty” blocks. The -S option (or --sparse) tells cp to handle these files efficiently, which is crucial when copying large disk images or database files that may contain a lot of empty space. For example:

cp --sparse=always large_image.img new_image.img

This command ensures that the empty blocks in large_image.img are not written to new_image.img, preserving disk space.

Leveraging cp in scripts

One of the most advanced uses of cp is within shell scripts for automation. When writing scripts, you can use cp in conjunction with other commands and shell features to perform complex file management tasks. For example, you might use a loop to copy a set of files with specific characteristics:

for file in $(find /source_directory -name '*.txt' -mtime -7); do
  cp $file /destination_directory/

This script snippet finds all .txt files in /source_directory modified in the last 7 days and copies each to /destination_directory. It’s an example of how cp can be a powerful component in larger automation tasks.

Walking through a real-world example

Let’s see a practical example where we’ll combine several concepts and use the cp command in a more complex scenario. Imagine you’re working on a project with multiple configuration files, and you need to make a backup of all these files before applying some major updates. We’ll use the cp command with various options to achieve this, including verbose output and backup creation.

Scenario setup

  • Current directory: /home/user/project
  • Files to back up: All .conf files in the config directory
  • Backup directory: backup/config_backup

First, let’s simulate the current state in the terminal:

user@linux:~$ cd /home/user/project
user@linux:/home/user/project$ ls config
database.conf  server.conf  ui.conf
user@linux:/home/user/project$ mkdir -p backup/config_backup

Performing the backup

Now, we’ll use the cp command to back up all .conf files from the config directory to backup/config_backup, creating a verbose output and generating numbered backups for any existing files in the backup directory.

Input in the terminal:
user@linux:/home/user/project$ cp -v --backup=numbered config/*.conf backup/config_backup/
Expected output:
‘config/database.conf’ -> ‘backup/config_backup/database.conf’
‘config/server.conf’ -> ‘backup/config_backup/server.conf’
‘config/ui.conf’ -> ‘backup/config_backup/ui.conf’

This output indicates that each .conf file from the config directory has been copied to the backup/config_backup directory. The -v option provides a detailed account of the files being copied, enhancing transparency.

Verifying the backup

To ensure our backup was successful, we can list the contents of the backup directory.

Input in the terminal:
user@linux:/home/user/project$ ls backup/config_backup

Expected output:

database.conf  server.conf  ui.conf

This output confirms that all .conf files from the config directory have been successfully backed up to backup/config_backup.

Making changes and creating another backup

Suppose we’ve made changes to server.conf and ui.conf and want to back up these files again, preserving the original backups.

Repeating the backup command:
user@linux:/home/user/project$ cp -v --backup=numbered config/*.conf backup/config_backup/
Expected output with numbered backups:
‘config/server.conf’ -> ‘backup/config_backup/server.conf’ (backup: ‘backup/config_backup/server.conf.~1~’)
‘config/ui.conf’ -> ‘backup/config_backup/ui.conf’ (backup: ‘backup/config_backup/ui.conf.~1~’)

This time, the output shows that the server.conf and ui.conf files were backed up again, and the original backups were preserved with a numbered suffix (e.g., .~1~). The database.conf file was not copied again since it hasn’t changed, demonstrating the efficiency of the --backup=numbered option.

My two cents on the cp command

I’ve grown particularly fond of the -a (archive) option, which is essentially a shortcut for -dR --preserve=all. It preserves all file attributes, including links, file permissions, ownership, and timestamps, making it ideal for backups. On the flip side, I’m not a fan of how cp handles overwriting files without a prompt by default. It’s why I almost always use the -i option in my commands.


The cp command is an essential tool for anyone working with files and directories in Linux. With its flexibility and ease of use, it’s a must-know command for anyone looking to manage files and directories efficiently. By mastering the cp command, you’ll be able to quickly and easily copy and move files and directories, making it a valuable tool for anyone working with files in Linux.

You may also like

Leave a Comment



FOSS Linux is a leading resource for Linux enthusiasts and professionals alike. With a focus on providing the best Linux tutorials, open-source apps, news, and reviews written by team of expert authors. FOSS Linux is the go-to source for all things Linux.

Whether you’re a beginner or an experienced user, FOSS Linux has something for everyone.

Follow Us


©2016-2023 FOSS LINUX



“Linux” is the registered trademark by Linus Torvalds in the U.S. and other countries.