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

Sobre Fábio Emilio Costa
Linux, Free Software, EMACS, Rugby, Indycar, Doctor Who, Harry Potter... Yep, this is me!

4 Responses to Um shell-script para renomear arquivos em massa

  1. Pingback: Um shell-script para renomear arquivos em massa - Versão Ruby « Linux… e mais coisas

  2. trastysourf disse:

    Eh.. Are you interested in my fresh seminar Wanna very nice joke?)) What did one cloned sheep say to the other? I am ewe.

  3. /bin/laden disse:

    Ótimo script para renomear arquivos em massa, feito em Perl

    http://www.slackbr.org/forum/viewtopic.php?f=46&t=17300

  4. auto disse:

    My brother recommended I may like this web site.

    He used to be totally right. This publish actually made my
    day. You cann’t consider just how so much time I had spent for this info! Thank you!

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s