Converting filenames to Title Case in Linux
Here's a simple bash one-liner to convert mixed-case filenames into Title Case:
rename 's/(\S+)/\u\L$1/g' *
This forces the file extension to lower-case as well.
Use rename -n
to test the command without changing anything on the filesystem.
(Adapted from this PerlMonks FAQ.)
Background
I have a bunch of inconsistently named files like:
HERE COMES THE SUN.mp3
hey jude.mp3
The lOng and wiNDing Road.mp3
I want them to appear as:
Here Comes The Sun.mp3
Hey Jude.mp3
The Long And Winding Road.mp3
Two Line Approach
First, rename all files to lower-case:
rename 'y/A-Z/a-z/' *
Second, make the first letter of each word Upper Case:
rename 's/(^|[\s_-])([a-z])/$1\u$2/g' *
mike says:
You didn't remove the spaces! What sort of monster are you!? 😉
I like the rename command though. Years of poking around *nix and I didn't recall ever encountering it. I would have used to mv and an argument involving tr to convert lowercase.
$ echo "The lOng and wiNDing Road.mp3" | tr [:upper:] [:lower:] the long and winding road.mp3
Paul Webster says:
Exceptions of course ... Old MacDonald Had A Farm and for fun ... try one towards the end of http://www.dandelionradio.com/tracklists/2012-01/
I was discussing same sort of thing recently - see posts about 5 down http://forums.slimdevices.com/archive/index.php/t-106900.html
Terence Eden says:
Yes, tricky with non-ASCII characters.
Andy Mabbett says:
Heretic! That should be:
Here Comes the Sun.mp3 Hey Jude.mp3 The Long and Winding Road.mp3
Friendships have ended over less 😉
Arthur says:
One thing it DOES NOT do is capitalize last word if it is a preposition which seems to be the rule in all three title case schools (Chicago, MLA and AP), but this does the job in probably 95%~99% cases.
Adrian says:
One line approach 🙂
rename -E 'y/A-Z/a-z/' -E 's/(^|[\s_-])([a-z])/$1\u$2/g' *
jamisan says:
elegant and simple. reminds me of an old unix bud of mine (god rest his soul). he said, i just love when I can write a one line program with a string of text and a couple of alt-shift-left-elbows. thanks terence. p.s. how can i find if you have other similar gems buried in your blogs?
@edent says:
Thanks! You'll find most of them at https://shkspr.mobi/blog/tag/linux/
Alan says:
Hi Guys,
I used the suggestion from XX above:
rename -E 'y/A-Z/a-z/' -E 's/(^|[\s_-])([a-z])/$1\u$2/g' *
This works great, except - it lowercases (if I can invent a word) a letter in the middle of a text string containing numbers such as:
CoMpany - X01B02 - LETTER.txt
becomes:
Company - X01b02 - Letter.txt
Is there any way top amend that one line command to avoid the 'B' in the middle of the reference getting changed to 'b' so that, instead, it comes out as:
Company - X01B02 - Letter.txt
I am guessing we need to look for a letter, not being the first character of a word, sandwiched between two numerals, but by RegExp fu is just not up to it!
If it helps, we can assume it is only ever a single letter with a numeral immediately left and right of it.
Thanks,
Alan.
CpILL says:
The first command doesn't work for me on Ubuntu 18.04 for some reason. Here is what it says for one file:
0003 BEYOND BAROQUE.mp3 not renamed: 0003 beyond baroque.mp3 already exists
?
@edent says:
It works on 19.04 - perhaps try updating?
John Tweed says:
Nobody mentions Roman Numerals !? IV -> IV not Iv etc HENRY III -> Henry III MCMLXIV ? (1964)