How to Copy, Move and Rename Files and Directories in Linux System
Tags: linux, ubuntu, beginners, computerscience
Published: 2020-05-23 15:22:53

Till now we have seen how to **explore** the Linux System, the meaning and use of **wildcards**, and **create** and **delete** files and directories in Linux System.

Now let us look at how we can **copy, move, and rename** these files and directories.

Let's start with how can we copy files and directories

**1. `cp` command**

The `cp` command stands for **copy** is used to **copy files and directories** in Linux System.

The syntax for `cp` command.

![copy syntax](https://dev-to-uploads.s3.amazonaws.com/i/6gxwoaq6f2b4loer0nhn.png)

We can simply use the `cp` command along with the **source** and **destination**.

![copy file single](https://dev-to-uploads.s3.amazonaws.com/i/2idl1jiyo8yqr30y7h11.png)

In the above example, we used the command ` cp file1.txt file2.txt` where

`cp` represents the copy command
`file1.txt` represents the source file "file1.txt"
`file2.txt` represents the destination file "file2.txt"

So what if file2.txt did not exist?

If file2.txt exists, it is overwritten with the contents of file1. If file2.txt does not exist, it is created.

Okay but can we do something to check when the file is being overridden?

- copy file1.txt to file2.txt and prompt if file2.txt is being overridden

![copy single file prompt](https://dev-to-uploads.s3.amazonaws.com/i/4owmz148v906obrb2wgf.png)

In the above example, we use the command ` cp -i file1.txt file2.txt` to copy file1.txt to file2.txt and we used to option `-i` to make it interactive and provide us a prompt if file2.txt is being overridden.

Okay so now we know how to copy files but what if we need to copy all the contents from directory1 to directory2?

- copy contents of one directory to another

![copy content directory](https://dev-to-uploads.s3.amazonaws.com/i/87166ovv6swsana5ndw5.png)

In the above example, we used wildcard `*` and created the command `cp logs1/* logs2` where

`cp` represents the copy command
`logs1` represents the source directory
`logs1/*` represents all the contents of the directory logs1
`logs2` represents the destination directory

Unlike the case of when we copy a file we need destination directory to exist when we use `cp` command.

So what if we want that
If the folder does not exist then the folder should be created and then contents should be copied.

![copy directory contents](https://dev-to-uploads.s3.amazonaws.com/i/l2tel69bez81plhl4mb6.png)

In the above example, we used the option `-r` and created a command `cp -r logs1 logs2` where

`cp` represents the copy command
`-r` represents recursively 
`logs1` represents the source directory
`logs2` represents the destination directory

Now we know how we can copy a single file/directory but what about multiple files and directories.

The `cp` command syntax for multiple files and directories

![copy multiple syntax](https://dev-to-uploads.s3.amazonaws.com/i/16r2gd1014nsof56840c.png)

We can simply use the `cp` command along with **all the sources** and the **destination**.

![copy multiple to directory](https://dev-to-uploads.s3.amazonaws.com/i/7z9jquhlremlxhrfrns8.png)

In the above example, we used the commands `cp file1.txt file2.txt logs1` where

`cp` represents the copy command
`file1.txt` represents the **source** file **file1.txt** 
`file2.txt` represents the **source** file **file2.txt**
`logs1` represents the **destination** directory **logs1**

These are the ways we can copy files/directories. Now let's have a look at how to move files/directories.

**2. `mv` command**

The `mv` command stands for **move** is used to **move files and directories** in Linux System.

The syntax for `mv` command.

![move syntax](https://dev-to-uploads.s3.amazonaws.com/i/1mbjnx7rjflepxilnmtp.png)

We can simply use the `mv` command along with the source and destination.

![move files dir](https://dev-to-uploads.s3.amazonaws.com/i/3jdycpolpim5i6zxz8kv.png)

In the above example, we used the command ` mv file2.txt logs1` where

`mv` represents the **move** command
`file2.txt` represents the **source** file **file2.txt**
`logs1` represents the **destination** directory **logs1**

To check whether the file has been moved to the destination directory we used the command `ls . logs1` where

`ls` represents **list** command
`.(Dot)` represents the **current working directory**
`logs1` represents the destination directory **logs1**

What if we want to move one directory to another directory?

- move directory logs1 to directory logs2

![move directory](https://dev-to-uploads.s3.amazonaws.com/i/2b0egmywz74hk9re65qk.png)

In the above example, we used the command ` mv logs1 logs2` where 

`mv` represents the **move** command
`logs1` represents the **source** directory **logs1**
`logs2` represents the **destination** directory **logs2**

To check whether the file has been moved to the destination directory we used the command `ls . logs2` where

`ls` represents **list** command
`.(Dot)` represents the **current working directory**
`logs2` represents the destination directory **logs2**

So, what happens if the destination logs2 does not exist?

If the directory does not exist then a new directory is created and then the contents are moved to that directory.

Similar to what we saw with `cp` command the `mv` command also overwrites the files if it already exists.

But what if we want to move only those files that are not already present in the destination directory and skip files that are already present?

- move files that either doesn't exist or are newer than the existing corresponding files

![move updated files](https://dev-to-uploads.s3.amazonaws.com/i/efg7bxk3h2xd192rtgqb.png)

In the above example, we first checked the content of the directories logs1 and logs2 and found that both logs1 and logs2 contain the file1 and file2.

After that, we used the command `mv -u logs1/* logs2` where
 
`mv` represents the **move** command
`-u` represents **update**
`logs1/*` represents the **content inside** the **logs1** directory
`logs2` represents the **destination** directory **logs2**

What if we want to move all the .txt files to a new folder?

- move **.txt** files to a folder named "text_files"

![move text files](https://dev-to-uploads.s3.amazonaws.com/i/y5hnhs076aqdeafzq9ib.png)

In the above example, we first listed all the contents of the current directory and then used the command ` mv *.txt text_files` where 

`mv` represents the **move** command
`*.txt` represents **all the .txt files**
`text_files` represents the **destination** directory **text_files**

To check whether all the files of type ".txt" have been moved or not we used the `ls . text_files` command where

`.` represents the current working directory
`text_files` represents the **destination** directory **text_files**

Now we know how to easily move tons of files within a second just by using our **wildcards**.

These are the ways we can move files/directories. Now let's have a look at how to rename a file/directory.

**3. `mv` command for renaming**

Hold on, didn't we just used the `mv` command to move the files and directories? 

Yes the `mv` command is used for both moving as well as renaming a file/directory.

The syntax for `mv` command for renaming

![rename syntax](https://dev-to-uploads.s3.amazonaws.com/i/0xcuetc8hz77aofdzjci.png)

To rename a file we just used `mv` command along with current_name and new_name

![rename file name](https://dev-to-uploads.s3.amazonaws.com/i/yticwuwj5uehia9afp81.png)

In the above example, we used the command `mv original new` where

`mv` represents **move** command
`original` represents the current_name **original**
`new` represents new_name **new**

**Note**:- Please be cautious that the new name that we are giving to the file is not the name of **already existing** file because if the file with **new_name** already exists then the file will be **overridden** when we use `mv` command.

Let's have a look at how we can rename a directory

![rename folder](https://dev-to-uploads.s3.amazonaws.com/i/kwu05p8zlx4jbeoluuyr.png)

In the above example, we used the command `mv original_folder/ new_folder` where

`mv` represents **move** command
`original_folder/` represents the current_name **original_folder**
`new_folder` represents new_name **new_folder**

Okay, so that’s all the commands we need to know for Copy, Move, and Rename Files and Directories in Linux System.

I hope you understood the basics of file manipulation in Linux. Please, let me know if there are any questions.