Rename Multiple Files in Linux Using Regex and perform Arithmetic

2 minute read

While working on my video library I noticed that I had to rename a bunch of files to have correct file names that include Show name and Episode name and number.

I have about 275 files named from 000-274, but I needed to rename them to specify the season and episode they correspond to.

For example, files from 125 - 150 are from season 5 of said show, and that is what I will use for this post.

An example of a file in the 125 - 150 range: ‘SHOW - 135 - Some Episode _www.unneededStuff.mp4’

As you can see the filename has the following structure (which I will modify later in this post)

(ShowName) - (filename #) - (EpisodeName)_(Extra unneeded stuff).(extension)

I will be using the Linux/Mac rename command to perform the renaming of these files (125-150). The end result should be that these files are renamed to have numbers from 501- 526 (for Season 5), so I will use arithmetic manipulate the numbers to be what I want. I will also clean up the name a little bit so that it does not include the ‘extra unneeded stuff’. The name of a file should be of form: ‘SHOW - 511 - Some Episode.mp4’

First make sure you work with the specific files you want to modify and nothing else:

$ ls SHOW\ -\ 1{2{5-9},3,4,50}*

// The above will show only files between 125 - 150 will be touched/modified. // Using Bash brace expansion will help create the list between 125 - 150 // the brace expansion will use anything that has numbers 125-129, and any 13*, 14*, 150

Use the rename command with a RegEx expression that will modify the name the way you want. I have the following regex expression:

's/(^.+)\s-\s(\d\d\d)(.+)_www.+(\..+$)/$1." - ".($2+376).$3.$4/e'

Explanation: // (^.+)\s-\s is the Show name plus ‘ - ‘, I am grouping just the name of the show to use it later // (\d\d\d) is the incorrect episode number used in the filename // (.+)_www.+ is the Episode name plus ‘unneeded stuff’, I am grouping just the episode name to use it later // (\..+$) is the file extension, I am grouping it to use it later

// Now what was found with the above Regex will be substituted as follows: $1 will have the Show name “ - ” I am concatenating literal “ - “ after the show name ($2+376) I am adding the episode number + 376, which will give me the correct episode number. For example for 135, now it will be 511 (which is Season 5 episode 11) $3 The Episode name captured from the previous regex $4 The file extension captured from the previous regex

Run rename with -n (dry run) using the regex and file list created above to verify it will give you what you want/expect.

$ rename -n 's/(^.+)\s-\s(\d\d\d)(.+)_www.+(\..+$)/$1." - ".($2+376).$3.$4/e' SHOW\ -\ 1{2{5..9},3,4,50}*

Output: … ‘SHOW - 135 - Some Episode_www.unneededStuff.mp4’ would be renamed to ‘SHOW - 511 - Some Episode.mp4’ …

Now run it again without -n:

$ rename  's/(^.+)\s-\s(\d\d\d)(.+)_www.+(\..+$)/$1." - ".($2+376).$3.$4/e' SHOW\ -\ 1{2{5..9},3,4,50}*