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:
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
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:
Here Comes the Sun.mp3
Hey Jude.mp3
The Long and Winding Road.mp3
Friendships have ended over less 😉
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.
rename -E 'y/A-Z/a-z/' -E 's/(^|[\s_-])([a-z])/$1\u$2/g' *
jamisan says:
@edent says:
Alan says:
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:
0003 BEYOND BAROQUE.mp3 not renamed: 0003 beyond baroque.mp3 already exists
?
John Tweed says:
IV -> IV not Iv etc
HENRY III -> Henry III
MCMLXIV ? (1964)