Renomeando arquivos de forma padronizada

Publicado por Sandro Marcell 01/11/2008

[ Hits: 8.423 ]

Homepage: http://sanmarcell.wordpress.com

Download perl_rename.pl




Simples Perl script que renomeia arquivos de forma padronizada. Ex.:

% ./script.pl --nome=texto --extensao=txt --contador=1 ~/arquivos/*
texto001.txt
texto002.txt
...
texto099.txt
texto100.txt
...

Espero que seja útil a alguém...

P.S.: Esse script ainda não "tá lá essas coisas", pelo fato de ser o segundo Perl script que escrevo na vida! =)

  



Esconder código-fonte

#!/usr/bin/env perl
#
# Renomeando arquivos de forma padronizada (Versao Perl).
#
# Sandro Marcell (sandro_marcell@yahoo.com.br)
# Boa Vista, Roraima - 03/09/2008 (Atualizado em 12/10/2008). 
#
# 12/10/2008
# - Adicionado suporte a opcoes longas;
# - Adicionada opcao de modo silencioso.
#
# Uso: Faca "./script.pl --ajuda" para mais detalhes.
#
# Obs.:
# - Se declaradas, as opcoes [-n]*, [-c]* e [-e]*, devem obrigatoriamente
# possuir valores *(o mesmo e valido para opcoes longas);
# - Se a opcao [-c] nao for declarada, o contador iniciara em 1;
# - Os arquivos renomeados serao movidos para o diretorio de trabalho
# corrente;
# - Ao declarar a opcao [-b], um subdiretorio sera criado em /tmp
# e os arquivos serao copiados para ele, antes de serem renomeados;
# - E possivel o uso de metacaracteres.

# Modulos utilizados:
use Getopt::Long;
use File::Copy;

$prog = $0;
$prog =~ s/.*\///g;

# Como utilizar o script:
sub __uso__ {
   print <<FIM;
Uso: $prog -abs [-c NUMERO] [-e EXTENSAO] [-n NOME] arquivo1 ... arquivoN
Onde:
-a,        --ajuda             : Mostra esta tela de ajuda.
-b,        --backup             : Cria backups dos arquivos
-c NUMERO,   --contador=NUMERO    : Contador numerico
-e EXTENSAO, --extensao=EXTENSAO  : Extensao dos arquivos
-n NOME,     --nome=NOME     : Novo nome dos arquivos   
-s,          --silencioso         : Modo silencioso

Exemplos:

# Renomear somente arquivos jpg:
$prog --nome=imagem --extensao=jpg --contador=1 ~/pessoal/*.[jJ][pP][gG]
# Renomear arquivos com o formato 001.txt ... 010.txt ..:
$prog -e txt ~/docs/*
# Criar backups antes de renomear arquivos:
$prog -b -n texto -c 10 -e txt ~/arqs/*
# Renomear arquivos de diferentes diretorios:
$prog --nome=copia --contador=1 --extensao=bkp ~/pessoal/* ~/docs/* ...
FIM
   exit(1);
}

# Inicializando variaveis:
$bkp    = '';
$cont   = 1 ;
$ext    = '';
$nome   = '';
$output = '';

# Checando parametros:
__uso__ unless (@ARGV);

# Opcoes que podem ser definidas pelo usuario:
%opc = ();
GetOptions(\%opc,
   'a|ajuda',
   'b|backup',
   'c|contador=i',
   'e|extensao=s',
   'n|nome=s',
   's|silencioso',
) || die("Faca '$prog --ajuda' para obter ajuda.\n");

# Caracteres invalidos (non-word) nao serao aceitos como argumentos 
# para as opcoes [-e] e [-n]:
__uso__ if $opc{e} =~ /\W/ || $opc{n} =~ /\W/;

# Obtendo ajuda:
__uso__ if defined $opc{a};

# Se a opcao [-b] for declarada, entao define-se o local onde sera
# criado o diretorio de backup e se ele nao existir, cria-o:
if (defined $opc{b}) { 
   our($bkp , $dbkp);
   $bkp  = "sim";
   $dbkp = "/tmp/$prog-$ENV{USER}";
   mkdir($dbkp) unless -d $dbkp;
}

# Extensao dos arquivos:
$ext = $opc{e} if defined $opc{e};
# Contador numerico:
$cont = $opc{c} if defined $opc{c};
# Novo nome dos arquivos:
$nome = $opc{n} if defined $opc{n};
# Modo silencioso:
$output = "nao" if defined $opc{s};

# O usuario especificou algum arquivo?
die("Erro: Especifique os arquivos a serem renomeados.\n") unless (@ARGV);

# Informando o destino dos arquivos renomeados:
print <<FIM;
ATENCAO: Os arquivos renomeados serao movidos para: $ENV{PWD}
Renomeando...
FIM
sleep(2);

# Loop de execucao:
foreach (@ARGV) {

   # Testes condicionais:
   if (! -e "$_") {
      print("[$_]: Arquivo nao encontrado.\n");
      next;
   } elsif (! -w "$_") {
      print("[$_]: Sem permissao para renomear.\n");
      next;
   } elsif (-d "$_") {
      print("[$_]: Diretorios nao serao renomeados.\n");
      next;
   }
   
   # Criar 'backups' antes de renomear arquivos?
   copy("$_" , $dbkp) if $bkp eq "sim";
   
   # Adicionando zeros ao contador (ex.: 001 ... 099):
   $zeros = sprintf("%03d" , $cont);
   # Concatenando variaveis para formar o novo nome:
   my $nn .= "${nome}${zeros}.$ext";
   
   # Renomeando...
   rename("$_" , $nn);
   print("[$_] Renomeado para: $nn\n") if $! == 0 && $output ne "nao"; 

   # Incrementando contador:
   $cont++;
}
# Fim

Scripts recomendados

Calculadora de IMC em Perl

Saiba quanto de energia seu PC gasta aproximadamente por mês

triangulo

Crivo de Eratóstenes Simples em Perl

data do servidor em perl


  

Comentários
[1] Comentário enviado por albertguedes em 01/11/2008 - 15:54h

Legal cara.
Mais um perl monger aumento as nossas fileiras hehehe

Vida longa ao perl.

[2] Comentário enviado por SMarcell em 01/11/2008 - 17:16h

*** ATENÇÃO ATENÇÃO ATENÇÃO ***

Por total falta de atenção minha =( acabei postando a versão incorreta desse script, então peço a quem quiser a versão correta, que pegue-a aqui:

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

Peço desculpas a todos pelo equivoco!

P.S.: Perl monger! Pô albert ainda não cheguei a esse nível não, mas um dia quem sabe né! =)




Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts