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.






















/bin/laden disse
Ótimo script para renomear arquivos em massa, feito em Tcl
http://www.slackbr.org/forum/viewtopic.php?f=46&t=17299