Um shell-script para renomear arquivos em massa – Versão Ruby

A algum tempo atrás, divulguei aqui um script para renomear arquivos em massa, desenvolvido em Bash. Porém, tive diversos problemas com esse script, principalmente com a questão de extensões em maiúsculas e minúsculas. Como estava procurando uma forma de desenvolver-me em programação Ruby, decidi escrever esse script novo em Ruby. Espero que faça bom proveito desse script, lembrando que ele depende da versão 1.8 do Ruby, principalmente por causa do pacote ‘Optparse’ para trabalhar a questão das opções do script.

PS: Algumas quebras de linha foram inseridas apenas para efeito de legibilidade do código. Elas estão fora da indentação comum do código.

#!/usr/bin/ruby

#
# Estabelecendo variáveis default
#

require 'fileutils'

require 'date'

require 'optparse'

require 'optparse/time'

require 'ostruct'

include FileUtils


options={}

options[:start_prefix]="DSC"

options[:end_prefix]=Date.today.year.to_s+('0'+Date.today.month.to_s)[-2..-1]+('0'+Date.today.day.to_s)[-2..-1]

extensions="(jpg|png|gif|bmp)"

options[:sequence]=0

options[:dir]=Dir.getwd

files=0

filler=''


#

# Utilizando OptionsParse (optparse.rb) para pegar argumentos GETOPTS

#

OptionParser.new do |opts|

  opts.banner = "Uso: ren_images [opções]"

  opts.separator ""

  opts.separator "Opções do script"

  opts.separator "================"

  opts.on("-sPREFIX", "--start-prefix=PREFIX", String, "prefixo inicial a ser usado", 

          "Padrão: #{options[:start_prefix]}") { |options[:start_prefix]| }

  opts.on("-ePREFIX", "--end-prefix=PREFIX", String, "prefixo final a ser usado", 

          "Padrão: #{options[:end_prefix]}") { |options[:end_prefix]| }

  opts.on("-nPREFIX", "--sequence-number=NUMBER", Integer,

          "numero de sequencia inicial a ser usado",

          "Padrão: #{options[:sequence]+1}") 

          { |options[:sequence]| options[:sequence]-=1 }

  opts.on("-dPREFIX", "--directory=DIR", String, 

          "numero de sequencia inicial a ser usado", 

          "Padrão: #{options[:dir]}") { |options[:dir]| }

  opts.on("-f", "--force", "sobrescreve arquivos e diretórios existentes") 

          { |options[:force]|  options[:force]=true }

  opts.on_tail("-h", "--help", "mostra essa mensagem") do

    puts opts

    exit

  end

  
end.parse!

er = "^#{options[:start_prefix]}[0-9]+\.#{extensions}$"

Dir.open(options[:dir]).each() do |x| 

  x=options[:dir]+"/"+x

  files+=1 unless (not File.exists?(x)) or File.directory?(x) or 

           (not x=~/^(#{options[:dir]}\/)?#{options[:start_prefix]}_?[0-9]+\.#{extensions}$/i)

  files+=1 if x=~^(#{options[:dir]}\/)?#{options[:start_prefix]}[_-]?[0-9]*\.#{extensions}$/i

end

if files==0

  puts "Não há arquivos a serem renomeados"

  exit

end

(Math.log10(files)).ceil.times { filler+='0' }

pos=-(Math.log10(files)).ceil


Dir.open(options[:dir]).sort().each() do |file|

  file_check=options[:dir]+"/"+file

  next if not File.exists?(file_check) or File.directory?(file_check) 

          or (not file_check=~/^(#{options[:dir]}\/)?#{options[:start_prefix]}[_-]?[0-9]*\.#{extensions}$/i)

  extension=file.split('.')

  new_name=String.new

  loop do

    options[:sequence]+=1

    final=filler + options[:sequence].to_s

    new_name=options[:end_prefix] + '_' + final[pos..-1] + '.' +  extension[-1].downcase

    break if not File.exists?(options[:dir]+'/'+new_name) or 

                 new_name.upcase == file.upcase

    break if options[:force]

    puts "Pulando #{new_name}... Arquivo já existe!"

  end

  if File.exists?(new_name)

    puts "Pulando #{new_name}... Arquivo é o mesmo!"

    next

  end

  mv(options[:dir]+"/"+file,options[:dir]+"/"+new_name)

end

Powered by ScribeFire.

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

One Response to Um shell-script para renomear arquivos em massa – Versão Ruby

  1. /bin/laden disse:

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

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

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