September 8, 2007

batch rename

Ever wanted to rename multiple files in one go? Try this script.


#!/bin/bash
#
# Replaces pattern $1 with $2 in
# file names from current working directory.
#
# This script handles spaces and
# quotes in file names and patterns.
#
# You need to escape leading dashes in patterns.
#
# EXAMPLES:
# ./script '\-old name' 'new'
# ./script "let' s" lets


counter=0

for file in *
do
echo "$file" | grep -q "$1"
if [ $? -eq 0 ]
then
newname="$( echo $file | sed "s/\(.*\)$1/\1$2/" )"
echo "$0: renaming $file to $newname"
mv "$file" "$newname" && let "counter += 1"
fi

done

echo "$0: $counter file(s) renamed"