Table of Contents

BASH - Files - Rename multiple files

The rename command which is part of the Perl installation helps.

All you need to know is the basics of regular expressions to define how the renaming should happen.


To add a '.old' to every file in your current directory. At the end of each expression ($) a '.old' will be set:

rename 's/$/.old' *

To make the filenames lowercase:

rename 'tr/A-Z/a-z/' *

To remove all double characters:

rename 'tr/a-zA-Z//s' *

You have many JPEG files that look like “img0000154.jpg” but you want the first five zeros removed as you don’t need them:

rename 's/img00000/img/' *.jpg

NOTE: Any Perl operator can be used as an argument.

The actual documentation for the 's' and 'y'/'tr' operators are found in the 'perlop' manpage.


Add an extension

ls
file1 file2 file3

Add the extension “.txt”

for F in $(ls);do mv $F $F.txt;done

Check the result:

ls
file1.rm file2.rm file3.rm

Change the extension

Change the extension from “.txt” to “.mp3”:

for F in $(ls);do mv $F $(echo $F|sed -e 's,\.rm,,').mp3 ;done

Check the result:

ls
file1.mp3 file2.mp3 file3.mp3

Remove the extension

for F in $(ls);do mv $F $(echo $F|sed -e 's,\.mp3,,') ;done

Check the result:

ls
file1 file2 file3

Only use ASCII characters

find . -type f -exec bash -c 'for f do d=${f%/*} b=${f##*/} nb=${b//[^A-Za-z0-9._-]/_}; [[ $b = "$nb" ]] || mv "$f" "$d/$nb"; done' _ {} +

NOTE: To test, use

find . -type d -exec bash -c 'for f do d=${f%/*} b=${f##*/} nb=${b//[^A-Za-z0-9._-]/_}; [[ $b = "$nb" ]] || echo mv "$f" "$d/$nb"; done' _ {} +
  • NOTE the echo statement included, which just prints out the command that will be run.
    • To actually do the move action, just remove the echo part.

NOTE: For directories use

find . -type d -exec bash -c 'for f do d=${f%/*} b=${f##*/} nb=${b//[^A-Za-z0-9._-]/_}; [[ $b = "$nb" ]] || mv "$f" "$d/$nb"; done' _ {} +