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' *

5 thoughts on “Converting filenames to Title Case in Linux

  1. 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

  2. #!/bin/bash
    
    for file in * ; do
        words=("$file")
        title=""
        wc=0
        for word in $words ; do
        first=$(echo $word | cut -c1 | tr ‘[[:lower:]]’ ‘[[:upper:]]’)
        others=$(echo $word | cut -c2-)
        word="$first$others"
        for prep in {The,A,An,As,At,But,By,For,In,Of,Off,On,Per,To,Up,Via,And,Nor,Or,So,Yet,With}
        do
            if [[ $wc -gt 0 ]] ; then
            if [[ "$word" == "$prep" ]] ; then
                word=`echo "$word" | tr '[A-Z]' '[a-z]'`
            fi
            fi
        done
        title="$title$word"
        title="$title "
        wc=$(($wc + 1))
        done
        #echo "$title"
        mv -- "$file" "$title" > /dev/null 2>&1
    done
    

    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.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.