Renomeando arquivos de forma padronizada

Publicado por Sandro Marcell 28/07/2008

[ Hits: 6.087 ]

Homepage: http://sanmarcell.wordpress.com

Download rename.tcl




Simples script em Tcl, que renomeia arquivos de forma padronizada.

Exemplo:

% script.tcl -n texto -e txt -c 1 ~/textos/*
texto001.txt
texto002.txt
...
texto099.txt
texto100.txt
...

Outras versões:
Bash e C Shell: http://www.slackbr.org/forum/viewtopic.php?f=45&t=15052

  



Esconder código-fonte

#!/usr/bin/tcl
#
# Simples script para renomear arquivos de forma padronizada.
#
# Sandro Marcell ([email protected])
# Boa Vista, Roraima - 11/07/2008.
#
# Uso: Faca "./script.tcl -a" para mais detalhes.
#
# Obs.:
# - Se declaradas as opcoes [-n], [-c] e [-e] devem obrigatoriamente
# possuir valores;
# - 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.

# Como utilizar o script:
proc uso {argv0} {
puts stdout "Uso: [file tail $argv0] -a -b -c \[numero\] -e \[extensao\] -n \[nome\] arquivo1 ...
Onde:
-a\[A\]          - Exibe esta tela de ajuda
-b\[B\]          - Cria bakcups dos arquivos
-c\[C\] numero   - Contador numerico
-e\[E\] extensao - Extensao dos arquivos
-n\[N\] nome     - Novo nome dos arquivos

Exemplos:

# Renomear somente arquivos jpg:
[file tail $argv0] -n imagem -c 1 -e jpg ~/pessoal/*.jpg
# Renomear arquivos com o formato 001.txt ... 010.txt ... 100.txt ..:
[file tail $argv0] -e txt ~/documentos/*
# Criar 'backups' dos arquivos antes de renomea-los:
[file tail $argv0] -b -n texto -c 10 -e txt ~/arquivos/*
# Renomear arquivos de diferentes diretorios:
[file tail $argv0] -n copia -c 1 -e bkp ~/pessoal/* ~/documentos/* ~/arquivos/*"
exit 1
}

# Checando parametros:
if {!$argc} {uso $argv0}

# Inicializando variaveis:
set nome {} ; set ext {} ; set ctd 1 ; set bkp {}

# Checando as opcoes definidas pelo usuario:
while {$argc != 0} {
   switch -glob -- [lindex $argv 0] {
   -[aA] {
      # Obtendo ajuda:   
      uso $argv0
   }
   -[bB] {
      # Criando 'backups':
      set bkp "sim"
      set dbkp /tmp/[file tail $argv0]_bkp-[pid]
      if {![file exists $dbkp]} {file mkdir $dbkp}
   }
   -[cC] {
      # Contador:
      # Descartando opcao [-c]:
      lvarpop argv 0
      set ctd [lindex $argv 0]
      # Somente numeros sao validos para o contador:
      if {[regexp {[^0-9]} $ctd] != 0} {set ctd 1}
   }
   -[eE] {
      # Extensao:
      lvarpop argv 0
      set ext [lindex $argv 0]
   }
   -[nN] {
      # Nome:
      lvarpop argv 0
      # Sem espacos em branco:
      set nome [regsub -all { } [lindex $argv 0] _]
   }
   -* {
      # Opcoes invalidas nao serao utilizadas: 
      puts stderr "'[lindex $argv 0]' Opcao invalida descartada!"
   }
   default {
      # Todo o restante que sobrar, sera considerado arquivo:
      break
   }
}
lvarpop argv 0
}

# O usuario especificou algum arquivo?
if {"$argv" == {} } {
   puts stderr "Especifique os arquivos a serem renomeados."
   exit 1
}

# Informando usuario:
puts stdout "ATENCAO: Os arquivos renomeados serao movidos para: [pwd]
Renomeando..."
sleep 2

# Loop de execucao:
foreach i $argv {
   # Criar 'backups' antes de renomear arquivos?
   if {$bkp == "sim"} {file copy -force -- "$i" $dbkp}

   # Testes condicionais:
   if {![file exists "$i"]} {
      puts stderr "\[$i\]: Arquivo nao encontrado."
      continue
   } elseif {![file owned "$i"]} {
      puts stderr "\[$i\]: Sem permissao para renomear."
      continue
   } elseif {[file isdirectory "$i"]} {
      puts stderr "Diretorios nao serao renomeados."
      continue
   }

   # Adicionando zeros ao contador (ex.: 001 ... 099):
   set zeros [format %.3d $ctd]
   # Concatenando variaveis para formar o novo nome:
   set nn [concat $nome$zeros.$ext]

   # Renomeando arquivos:
   if {[catch {file rename -force -- "$i" $nn}] == 0} {
      puts stdout "\[$i\] Renomeado para: $nn"
   }

   # Incrementando contador:
   incr ctd
}
# Fim

Scripts recomendados

O mundo do Polinômio

tkFind

Script lixeira em Tcl

Calculadora em Tcl/Tk

O mundo do Polinômio


  

Comentários
[1] Comentário enviado por SMarcell em 28/10/2008 - 03:45h

Pegue a versão melhorada desse script aqui: http://www.slackbr.org/forum/viewtopic.php?f=46&t=17299


Contribuir com comentário