Linux… e mais coisas

Um espaço para dizer um pouco mais sobre coisas interessantes…

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

Publicado por Fábio Emilio Costa em 11 11UTC Julho 11UTC 2007

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.

Uma resposta para “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

XHTML: Você pode usar estas tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>