Um shell-script para renomear arquivos em massa

Quem tem câmera digital sabe o quanto é chato aqueles nomes padrões dados pelas câmeras aos arquivos. Você normalmente não tem como saber que ‘DSC00001.JPG’ é a foto da sua irmã durante o Revellion ou qualquer coisa assim. Para isso, vários programas em várias plataformas tem como objetivo renomear em massa arquivos, ou seja, renomear os arquivos de modo que sigam um padrão identificável.

No Linux, infelizmente, não existe algo assim… Mas felizmente existe o bash. Usando este script, você pode renomear os arquivos de sua digital com um nome apropriado para você. Espero que você faça bom proveito do script.

#!/bin/bashi=1

startprefix="DSC"

endprefix=`hostname`

force=

verbose=

scriptname=${0##*/}

while getopts 'hs:fvn:' OPT_LETRA

do

  case $OPT_LETRA in

     'h') echo "Script para renomear arquivos em massa baseado em prefixo"

   echo

   echo "$scriptname [OPÇÕES] [prefixo_final] (padrao $endprefix)"

   echo

   echo "Opções:"

   echo

   echo "-h            retorna essa mensagem de erro"

   echo "-s [prefixo]  prefixo inicial a ser usado (padrao $startprefix)"

   echo "-n [numero]   numero de sequencia inicial a ser usado (padrao $i)"

   echo "-v            verboso: mostra todas as informacoes"

   echo "-f            sobrescreve arquivos e diretórios existentes"

   exit 0

   ;;

     's') startprefix=$OPTARG

   ;;

     'n') i=$OPTARG

   ;;

     'v') verbose="1"

   ;;

     'f') force="1"

  esac

done

shift `expr $OPTIND - 1`

if [ -n "$1" ]; then

endprefix=$1

fi

files=`ls ${startprefix}*`

total_files=`echo $files |  sed -e 's/ /\\n/g' | wc |  sed -re 's/[ \\t]+/ /g' | cut -d' ' -f2`

pow=0

howmuch=1

while true; do

    if [ $total_files -lt $howmuch ]; then

 break;

    fi

    howmuch=$(($howmuch * 10))

    pow=$(($pow + 1))

done

zero_fill=""

for t in `seq $pow`; do zero_fill="${zero_fill}0"; done

regex="s/^.\\+\\(.\\{$pow\\}\\)$/\\1/"

for actual_file in $files; do

echo $actual_file |  grep -E -e '\\.(jpg|png|gif|bmp)$' > /dev/null

if [ $? -eq 0 ]; then

while true; do

extension=`echo $actual_file | sed -e 's/.\\+\\(\\.\\(gif\\|bmp\\|jpg\\|png\\)\\)$/\\1/'`

     sequence="${zero_fill}${i}"

suffix=`echo $sequence | sed -e $regex`

newfile="${endprefix}_${suffix}$extension"

i=$((i + 1))

if [ -e $newfile -a -z "$force" ]; then

if [ $newfile == $actual_file ]; then

echo "$newfile é o mesmo... Pulando"

 	   break

fi

echo "Pulando - $newfile já existe ..."

else

if [ ! -z "$verbose" ]; then

 	    args='-v'

 	fi

 	if [ ! -z "$force" ]; then

 	    args="${args} -f"

 	fi

 	mv $args "$actual_file" $newfile

 	break

fi

done

    fi

done
Anúncios

~ por 3c0linux em agosto 25, 2008.

 
%d blogueiros gostam disto: