Hola
Este es mi primer script en Ruby, Y lo he hecho con mucha ayuda sino no habría podido
Lo único que me preocupa del script es el def "todos", no se si está bien hecho.
Y me gustaría simplificar la comprobacion de los argumentos así por ejemplo:
if (ARGV[0])==(-h|--help)
help()
end
Pero no se hacerlo bien xD
Si ven algún error o mejora diganmelo, gracias
EDITO:
Por cierto, Me parece tremendamente inseguro que al usar:
File.rename
Si existe un archivo con el mismo nombre que el archivo nuevo (renombrado), El archivo se reemplaza por el renombrado, En vez de dar error... O algo parecido xD
# -*- coding: UTF-8 -*-
# Renombrador preconfigurado de archivos
#
# El código original es de RyogiShiki
# http://foro.elhacker.net/scripting/solucionado_ruby_renombrando_un_caracter_ilegal-t354066.0.html
# Gemas, Módulos...
require 'find'
exit if Object.const_defined?(:Ocra)
system('chcp 1252 >NUL')
# Métodos
def reset_vars()
$total = -1
$renamed = 0
end
def resultado()
puts " Procesados: #{$total} archivos"
puts " Renombrados: #{$renamed} archivos"
system('chcp 850 >NUL')
Process.exit
end
def advise()
print ' Use "Renamer.exe -a" Para mostrar la ayuda.' + "\n"
system('chcp 850 >NUL')
Process.exit
end
def help()
system('chcp 850 >NUL')
print "\n Modo de empleo:\n\n"
print " " + __FILE__.split('/').last + " [Opci\u00F3n] [Ruta]\n\n"
print "\n Opciones: \n\n"
print " -c --comilla Reemplaza \[\u00B4\] por \[\u0027\]\n\n"
print " -e --extension Reemplaza [ .mp3] por [.mp3]\n\n"
print " -f --featuring Reemplaza [ ft ],[ ft. ],[ feat ],[ featuring ] por [ feat. ]\n\n"
print " -g --guion Reemplaza \[\u2013\] por \[-\]\n\n"
print " -i --interrogante Elimina \[\u00BF\]\n\n"
print " -t --todo Combina todas las opciones (-c + -e + -f + -g + -i)\n"
Process.exit
end
def reemplazar(caracter_a_reemplazar, nuevo_caracter)
$total = -1
Find.find(ARGV[1].gsub("\\", "/")) { |path|
path = path.encode('utf-8')
if path[caracter_a_reemplazar] then
if File.exist?(path.gsub(caracter_a_reemplazar, nuevo_caracter))
print "\n ERROR. El archivo a reemplazar ya existe: " + (path).split('/').last + "\n"
else
File.rename(path, path.gsub(caracter_a_reemplazar, nuevo_caracter))
$renamed += 1
end
end
$total += 1
}
end
# Argumentos
if (ARGV.empty?) then
help()
end
if (ARGV[0])=="-a" or ARGV[0] == "/?"
help()
end
if (ARGV[1])==()
print "\n ERROR. Debe introducir una ruta...\n\n"
advise()
elsif if not File.directory? (ARGV[1]) then
print "\n ERROR. La ruta no existe...\n\n"
advise()
end
end
if ARGV[0] == "-c" or ARGV[0] == "--comilla"
reset_vars()
reemplazar("\u00B4", "\u0027")
resultado()
elsif (ARGV[0])=="-e" or ARGV[0] == "--extension"
reset_vars()
reemplazar(" .mp3", ".mp3")
reemplazar(" .MP3", ".mp3")
reemplazar(" .Mp3", ".mp3")
resultado()
elsif (ARGV[0])=="-f" or ARGV[0] == "--featuring"
reset_vars()
reemplazar(" ft. ", " feat. ")
reemplazar(" Ft. ", " feat. ")
reemplazar(" FT. ", " feat. ")
reemplazar(" ft ", " feat. ")
reemplazar(" Ft ", " feat. ")
reemplazar(" FT ", " feat. ")
reemplazar(" feat ", " feat. ")
reemplazar(" Feat ", " feat. ")
reemplazar(" FEAT ", " feat. ")
reemplazar(" featuring ", " feat. ")
reemplazar(" Featuring ", " feat. ")
reemplazar(" FEATURING ", " feat. ")
resultado()
elsif (ARGV[0])=="-g" or ARGV[0] == "--guion"
reset_vars()
reemplazar("\u2013", "-")
resultado()
elsif (ARGV[0])=="-i" or ARGV[0] == "--interrogante"
reset_vars()
reemplazar("\u00BF", "")
resultado()
elsif (ARGV[0])=="-t" or ARGV[0] == "--todo"
reset_vars()
reemplazar("\u00B4", "\u0027")
reemplazar("\u2013", "-")
reemplazar("\u00BF", "")
reemplazar(" ft. ", " feat. ")
reemplazar(" Ft. ", " feat. ")
reemplazar(" FT. ", " feat. ")
reemplazar(" ft ", " feat. ")
reemplazar(" Ft ", " feat. ")
reemplazar(" FT ", " feat. ")
reemplazar(" feat ", " feat. ")
reemplazar(" Feat ", " feat. ")
reemplazar(" FEAT ", " feat. ")
reemplazar(" featuring ", " feat. ")
reemplazar(" Featuring ", " feat. ")
reemplazar(" FEATURING ", " feat. ")
reemplazar(" .mp3", ".mp3")
reemplazar(" .MP3", ".mp3")
reemplazar(" .Mp3", ".mp3")
resultado()
end
Mirándolo rápido no veo nada que objetar, para lo que mencionas al principio puedes usar "or":
if (ARGV[0])=="-h" or "--help"
help()
--EDIT--
Para que el archivo no se reemplace con File.rename puedes comprobar si el archivo ya existe con File.exist?(file)
Esta podría ser la forma correcta:
if (File.exist?(path_to_file))
print "ERROR!!"
--EDIT--
Una sugerencia más, para reducir la cantidad de lineas, puedes definir una función más genérica, que reciba parámetros, y llamar a la función en base a los argumentos. Me refiero a que se simplifica mucho de la siguiente forma:
def reemplazar(caracter_a_reemplazar, nuevo_caracter)
Find.find(ARGV[1].gsub("\\", "/")) { |path|
path = path.encode('utf-8')
if path[caracter_a_reemplazar] then
File.rename(path, path.gsub(caracter_a_reemplazar, nuevo_caracter))
$renamed += 1
end
$total += 1
}
end
if (ARGV[0] == "-c" or "--comilla")
reemplazar("\u004B", "\u0027")
else if ...
Saludos
Eres un genio de ruby jeje muxas gracias por todo
Cita de: RyogiShiki en 20 Febrero 2012, 17:43 PM
if (ARGV[0])=="-h" or "--help"
help()
if (ARGV[0])=="-h"
help()
elsif (ARGV[0])=="-c" or "--comilla"
reset()
comilla()
resultado()
end
Me da error en la linea del END
1.rb:147: warning: string literal in condition
He intentado de la siguiente manera pero solo funciona "-c" y me manda el mismo error:
elsif (ARGV[0]).eql? "-c" or "--comilla"
elsif (ARGV[0])==("-c" or "--comilla")
elsif (ARGV[0]) == ("-c") or ("--comilla")
elsif (ARGV[0]) == "-c" == "--comilla"
Otro problema que tengo es que al usar la opcion "-f" o "-t" no consigo que me muestre correctamente el número de archivos renombrados
Por ejemplo si uso "-f" y tengo este archivo:
abc ft. ft abc.txt
Lo renombra dos veces, así:
abc feat. ft abc.txt
abc feat. feat. abc.txt
1+1
Y entonces se repite el valor en la variable global, el resultado es: "archivos renombrados: 2"
He intentado meter la variable "$renamed" dentro del "def reemplazar", Pero el resultado es un campo vacío, No me da ningún valor.
Un saludo y gracias d nuevo!!!
Ups! Cuanto lo siento. He cometido un error garrafal. es un error que suelo cometer bastante cuando escribo código al vuelo, no me doy cuenta. Mea Culpa. La manera correcta de hacerlo es esta:
if ARGV[0] == "-c" or ARGV[0] == "--comilla"
Lo siento por el quebradero de cabeza! XD otra vez, fue mi culpa, no me fije.
Ahora el segundo problema que tienes no lo entiendo muy bien, puesdes explicarte mejor.
Saludos
Cita de: RyogiShiki en 23 Febrero 2012, 04:03 AM
if ARGV[0] == "-c" or ARGV[0] == "--comilla"
Gracias!
esto no me funciona:
if not (ARGV[0]) == "-c" or (ARGV[0]) == "--comilla"
print "\n ERROR. Opcion incorrecta...\n\n"
advise()
end
if not (ARGV[0]) == "-c" or not (ARGV[0]) == "--comilla"
print "\n ERROR. Opcion incorrecta...\n\n"
advise()
end
Solo reconoce "-c"
que estaré haciendo mal?
El segundo problema no tiene mucha importancia
Solo es que si uso la opcion "-f" o "-t" del script, y encuentra 2 o más coincidencias en el mismo archivo, por ejemplo en el archivo: "
Artista ft. FT - Titulo.mp3"
Primero lo renombra a esto: "Artista feat. Featuring - Titulo .mp3" ,Y se suma el valor +1 en la variable RENAMED
Lo vuelve a renombrar a esto: "Artista feat. feat. - Titulo .mp3" ,Y se suma el valor +1 en la variable RENAMED otra vez
Entonces me dice RENAMED que ha renombrado 2 archivos, Cuando en realidad solo ha sido 1 archivo.