Rename Files in Bulk from the Command Line

Posted on July 6th, 2008 in Tech Tips by gmendoza

Renaming a large number of files can seem like a daunting task, but no worries, your trusty Linux CLI is at your service. For this example, we will rename a number of MP3’s located in multiple subdirectories with a couple very easy commands; “find” and “rename”.

By listing the following directory, you’ll see that the MP3’s have been named with “(LP Version)”, and of course I don’t like this naming convention.

$ cd ~/Music/Metallica/Metallica/
$ ls -1
01 - Enter Sandman (LP Version).mp3
02 - Sad But True (LP Version).mp3
03 - Holier Than Thou (LP Version).mp3
04 - The Unforgiven (LP Version).mp3
05 - Wherever I May Roam (LP Version).mp3
06 - Don't Tread On Me (LP Version).mp3
07 - Through The Never (LP Version).mp3
08 - Nothing Else Matters (LP Version).mp3
09 - Of Wolf And Man (LP Version).mp3
10 - The God That Failed (LP Version).mp3
11 - My Friend Of Misery (LP Version).mp3
12 - The Struggle Within (LP Version).mp3

We’ll use the “rename” command to search for and delete the string ” (LP Version)” in any of the mp3 file names.

Syntax:

$ rename (search command) (files)
$ rename 's/search_for_string/replace_string_with_this/' files

To delete the matching string, simply leave the replace area empty like so:

$ rename 's/search_for_string//' files

Our Example:

$ rename 's/ \(LP Version\)//' *.mp3

Notice, the left and right parentheses need to be preceded with a backslash “\” character, although the spaces do not. The backslash is a metacharacter used to give you control over what your are matching against. For more info, here’s a link to a decent tutorial on the matter.

You can see the results of the command below.

$ ls -1
01 - Enter Sandman.mp3
02 - Sad But True.mp3
03 - Holier Than Thou.mp3
04 - The Unforgiven.mp3
05 - Wherever I May Roam.mp3
06 - Don't Tread On Me.mp3
07 - Through The Never.mp3
08 - Nothing Else Matters.mp3
09 - Of Wolf And Man.mp3
10 - The God That Failed.mp3
11 - My Friend Of Misery.mp3
12 - The Struggle Within.mp3

Now, to rename a large number of files spanning multiple directories, simply combine “rename” with the power of the “find” command.

Syntax:

find . -type f -name *.mp3 -exec rename 's/ \(LP Version\)//' '{}' \;

In this example, we searched starting from the current directory for only files with .mp3 in their file names. We use the find command’s -exec option to execute the rename command against the result set. See the find(1) manpage for more info.

Other useful examples:

Replace all spaces with underscores
rename 's/ /\_/g' *.mp3

Replace all uppercase with lowercase characters
rename 'y/[A-Z]/[a-z]/' *.mp3

Easy stuff, and you don't even need any fancy applications to do the job!

5 Responses to 'Rename Files in Bulk from the Command Line'

Subscribe to comments with RSS or TrackBack to 'Rename Files in Bulk from the Command Line'.

  1. Bill said,

    on July 28th, 2008 at 12:10 pm

    I’m trying to do this, I have “Discogs.url.url” files in about 600 different directories and I want to drop the last “.url”. Here’s the syntax I used and the message I get

    /media/sdb1/Music/mp3/electronic$

    find . -type f -name Discogs.url.url -exec rename ’s/ Discogs.url//’ ‘{}’ ;

    find: missing argument to `-exec’

    Can you perhaps tell me what I did wrong?

  2. Bill said,

    on July 28th, 2008 at 12:42 pm

    Hm okay… i noticed a few problems above. However, this is my new command and it doesn’t do anything

    find /media/sdb1/Music/mp3/electronic* -type f -name Discogs.url.url -exec rename ’s/ Discogs.url//’ ‘{}’ \;

    see, i want to take all the Discogs.url.url files in the directory electronic and rename them to Discogs.url

    Thanks.

  3. gmendoza said,

    on July 28th, 2008 at 5:37 pm

    Ack! wait up. You have a space in front of your search and replace… which is why nothing is happening. But you also risk deleting the wrong part of your file names.

    ’s/ Discogs.url//’ will end up deleting anything that matches ” Discogs.url”. That will leave you with a file name of just “.url”. hehe.

    You probably want the following:

    cd /media/sdb1/Music/mp3/electronic
    find . -type f -name Discogs.url.url -exec rename ’s/Discogs.url/Discogs/’ ‘{}’ \;

    This will change the “Discogs.url” to simply “Discogs”, making the new full file name “Discogs.url”

  4. Bill said,

    on July 28th, 2008 at 9:07 pm

    Ah. I see. I manually renamed the first 300 files and then got sick of it and found your blog. i think i get the general idea, though i’m trying to figure out the syntax of all the elements. Thank you very much. This will be very helpful in the future.

  5. caridreni said,

    on April 22nd, 2009 at 5:03 am

    hm. bookmarked :)

Post a comment