Rename Files and Directories in Linux Command Line

In this basic command line tutorial, learn the various ways of renaming the files and directories in the Linux terminal.
Warp Terminal

How do you rename files and directories in the Linux terminal? You use the mv command.

Yes, the same mv command which is used for 'moving' files and folders from one location to another.

You can simply specify the new name for the files and directories while 'moving them'.

To rename a file, use:

mv old_file new_file

Similarly, to rename a directory, use:

mv old_dir new_dir

Sounds easy, right? But I'll discuss renaming of files in detail here:

  • Show you practical examples of renaming
  • Show example of bulk renaming multiple files by combining the find and exec command
  • Discuss a dedicated rename utility for batch renaming files

Let's see it one by one.

Renaming files and directories with mv command

Use the mv command to rename a file in the same directory:

mv file1.txt file2.txt

Similarly, you can rename a directory in the same location:

mv dir1 dir2

Here's an example where I rename a file and a directory:

Renaming files and directories in Linux command line

As you can see, unlike the cp command, you don't have to use the recursive option for handling directories with mv command.

🚧
If you trying renaming the file with the same name, you'll see an error (obviously).

You may also rename a file while moving it to another location:

mv old-file-name another_dir/new-file-name

In the example below, I moved the file named firefox-quiz.txt to the sample directory. And while doing that, I renamed it quiz.txt.

Renaming file while moving them to another location

I think of it as the cut-paste operation.

πŸ’‘
While you can move multiple files to another location (mv file1 file2 file2 dir), you CANNOT rename multiple files with mv. For that, you have to employ other tactics that I discuss in the following sections.

Renaming multiple files matching a pattern by combining mv, find and exec commands

🚧
Be extra careful while batch renaming files like these. One wrong move and you'll end up with undesired result that can not be undone.

The find command is used for finding files in the given directory based on their name, type, modification time and other parameters. The exec command is combined with find to execute commands on the result of the find command.

There is no set, standard structure to use find, exec and mv commands. You can combine them as per your need.

Let's say you want to rename all the files ending with .txt in the current directory by adding _old in its name. So file_1.txt becomes file_1.txt_old etc.

find . -type f -name "*.txt" -exec mv {} {}_old ;
bulk renaming files in Linux

This is just an example and your renaming requirements could be different. Also, the above works with filenames without spaces only.

Pro Tip: When dealing with bulk actions like this, you can smartly use the echo command to see what action will be performed instead of actually performing it. If it looks alright, then go with the actual action.

For example, first see what files will be renamed:

find . -type f -name "*.txt" -exec echo mv {} {}_old \;
Dry run bulk file renaming with echo command

As you can see, no files were actually renamed. But you get to see what command will be the action if you run the above command without echo.

If it looks alright to you, remove the echo command and proceed with actual renaming.

find . -type f -name "*.txt" -exec mv {} {}_old \;

I learned this trick in the Efficient Linux at the Command Line book. An excellent book filled with small gems like this. No wonder it has become one of my favorite Linux books.

New Book: Efficient Linux at the Command Line

Pretty amazing Linux book with lots of practical tips. It fills in the gap, even for experienced Linux users. Must have in your collection.

Get it from Amazon

Renaming multiple files easily with the rename command

There is a handy command line utility called rename which could be used for batch renaming files based on the given Perl regex pattern.

This utility is not party of GNU toolchain and neither it comes preinstalled. So you have to use your distribution's package manager to install it first.

For Debian/Ubuntu, the command would be:

sudo apt install rename

You can use it in the following manner:

rename [options] perl_regex [files]

The options are:

  • -v : Verbose mode
  • -n : No action, show the files that would be renamed but don’t rename them
  • -o : No overwrite
  • -f : Force overwrite existing files
  • -s : Don't rename the soft link but its target

Now, let's take the same example that you saw in the previous section. Renaming the *.txt to .txt_old.

rename 's/\.txt$/.txt_old/' **

I am not going to explain the regex here. The ** means to look into all files in all subdirectories.

Use rename command in Linux

And as you can see, it works as expected.

🚧
On Red Hat and Fedora, the rename command is a C implementation and thus it may have different syntax and behavior. Read more about it.

Conclusion

I hope you liked this tip that helps you learn to do basic tasks in the Linux command line. Of course, it is for those who want to learn and use the command line. Desktop users always have the GUI tools for such tasks.

If you are absolutely new to Linux commands, this series will help you a great deal.

Getting Started With Linux Terminal
Want to know the basics of the Linux command line? Here’s a tutorial series with a hands-on approach.

Let me know if you have questions or suggestions.

About the author
Abhishek Prakash

Abhishek Prakash

Created It's FOSS 11 years ago to share my Linux adventures. Have a Master's degree in Engineering and years of IT industry experience. Huge fan of Agatha Christie detective mysteries πŸ•΅οΈβ€β™‚οΈ

It's FOSS

Making You a Better Linux User

It's FOSS

Great! You’ve successfully signed up.

Welcome back! You've successfully signed in.

You've successfully subscribed to It's FOSS.

Success! Check your email for magic link to sign-in.

Success! Your billing info has been updated.

Your billing was not updated.