Re: How to "mass" renaming files

Top Page
Attachments:
Message as email
+ (text/plain)
+ signature.asc (application/pgp-signature)
+ (text/plain)
Delete this message
Reply to this message
Author: Joseph Sinclair
Date:  
To: Main PLUG discussion list
Subject: Re: How to "mass" renaming files
Below is a script I use to rename image files. It does a lot, including renumbering, but it should be easy enough to modify for your needs.

--------------------------------------------------------------------------------
#!/bin/bash

function print_help
{
echo Syntax is "$0 <source folder> <new file prefix> [<start number>]"
}

function rename_one_file
{
local file_suffix=${1##*.}
local file_suffix=${file_suffix/%AVI/avi}
local file_suffix=${file_suffix/%MPG/mpeg}
local file_suffix=${file_suffix/%MPEG/mpeg}
local file_suffix=${file_suffix/%JPG/jpg}
local file_suffix=${file_suffix/%MOV/mov}
local file_suffix=${file_suffix/%JPEG/jpeg}
local file_suffix=${file_suffix/%PNG/png}
local file_suffix=${file_suffix/%GIF/gif}
local file_suffix=${file_suffix/%jpg/jpeg}
local file_suffix=${file_suffix/%mpg/mpeg}
mv "${1}" "${2}${3}.${file_suffix}"
echo ${1} renamed to ${2}${3}.${file_suffix};
}

function fixup_file
{
local source_file="$1"
local file_prefix="$2"
fixup_temp_sequence=$((${fixup_temp_sequence} + 1))
if [[ ${fixup_temp_sequence} -lt 10 ]]; then local file_prefix="${file_prefix}0"; fi
if [[ ${fixup_temp_sequence} -lt 100 ]]; then local file_prefix="${file_prefix}0"; fi

rename_one_file "${source_file}" "${file_prefix}" ${fixup_temp_sequence};
}

function rename_images
{
pushd "$1" >/dev/null

for CurrentFile in *.jpeg; do fixup_file "${CurrentFile}" "${2}-"; done
for CurrentFile in *.jpg; do fixup_file "${CurrentFile}" "${2}-"; done
for CurrentFile in *.png; do fixup_file "${CurrentFile}" "${2}-"; done
for CurrentFile in *.gif; do fixup_file "${CurrentFile}" "${2}-"; done
for CurrentFile in *.JPEG; do fixup_file "${CurrentFile}" "${2}-"; done
for CurrentFile in *.JPG; do fixup_file "${CurrentFile}" "${2}-"; done
for CurrentFile in *.PNG; do fixup_file "${CurrentFile}" "${2}-"; done
for CurrentFile in *.GIF; do fixup_file "${CurrentFile}" "${2}-"; done
find . -type f -exec chmod ugo-x {} \;
find . -type f -exec chmod ugo+r {} \;

popd >/dev/null
}

function rename_videos
{
pushd "$1" >/dev/null

for CurrentFile in *.avi; do fixup_file "${CurrentFile}" "${2}-"; done
for CurrentFile in *.mpeg; do fixup_file "${CurrentFile}" "${2}-"; done
for CurrentFile in *.mpg; do fixup_file "${CurrentFile}" "${2}-"; done
for CurrentFile in *.mov; do fixup_file "${CurrentFile}" "${2}-"; done
for CurrentFile in *.AVI; do fixup_file "${CurrentFile}" "${2}-"; done
for CurrentFile in *.MPEG; do fixup_file "${CurrentFile}" "${2}-"; done
for CurrentFile in *.MPG; do fixup_file "${CurrentFile}" "${2}-"; done
for CurrentFile in *.MOV; do fixup_file "${CurrentFile}" "${2}-"; done
find . -type f -exec chmod ugo-x {} \;
find . -type f -exec chmod ugo+r {} \;

popd >/dev/null
}

function fixup_folder
{
shopt -s nullglob
source_dir="$1"
local new_prefix="$2"
if [[ -n $3 ]]; then fixup_temp_sequence=$3; else fixup_temp_sequence=1; fi

fixup_temp_sequence=$((${fixup_temp_sequence} - 1))

   if [[ -d ${source_dir} ]]; then
     if [[ -n ${new_prefix} ]]; then
       rename_images "${source_dir}" "${new_prefix}";
       if [[ -n $3 ]]; then fixup_temp_sequence=$3; else fixup_temp_sequence=1; fi
       fixup_temp_sequence=$((${fixup_temp_sequence} - 1))
       rename_videos "${source_dir}" "${new_prefix}";
     else
       print_help;
     fi
   else
     print_help;
   fi
}


fixup_folder "$1" "$2" "$3"
--------------------------------------------------------------------------------


Josef Lowder wrote:
> Can anyone provide a simple shell script command to 
> change the file names of all the files in a given directory? 
>     from pict0001.jpg to just 01.jpg 
>     from pict0002.jpg to just 02.jpg etc. etc. 
> with the numbers running to a few hundred pix, all with 
> the same "pict00..." first part of the filename. 

>
> I looked on the 'net to find a shell script to "mass" rename the files
> in any given directory and found the example below to rename the
> suffix from php3 to just php, but I couldn't figure out how to modify
> that to change the filename itself.
>
> ls -d *.php3 | sed 's/\(.*\).php3$/mv "&" "\1.php"/' | sh
>
> I also found a *nix utility on my system named 'rename' but I
> couldn't get it to work. Below is an excerpt from the 'man' page
> for 'rename' ... but what in the world is 'foo'??
>
> MAN PAGE excerpt:
> rename will rename the specified files by replacing
> the first occurrence of from in their name by to.
> For example, given the files foo1, ..., foo9, foo10, ..., foo278, the
> commands
>
> rename foo foo0 foo?
> rename foo foo0 foo??
>
> will turn them into foo001, ..., foo009, foo010, ..., foo278.
> And
> rename .htm .html *.htm        will fix the extension of your html files. 

>
> ---------------------------------------------------
> PLUG-discuss mailing list -
> To subscribe, unsubscribe, or to change you mail settings:
> http://lists.PLUG.phoenix.az.us/mailman/listinfo/plug-discuss
>

---------------------------------------------------
PLUG-discuss mailing list -
To subscribe, unsubscribe, or to change you mail settings:
http://lists.PLUG.phoenix.az.us/mailman/listinfo/plug-discuss