[Ruby] Me ayudan a corregir este script?

Iniciado por Eleкtro, 20 Febrero 2012, 17:33 PM

0 Miembros y 1 Visitante están viendo este tema.

Eleкtro

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:

Código (ruby) [Seleccionar]
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






Código (ruby) [Seleccionar]
# -*- 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








RyogiShiki

#1
Mirándolo rápido no veo nada que objetar, para lo que mencionas al principio puedes usar "or":

Código (ruby) [Seleccionar]
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:
Código (ruby) [Seleccionar]

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:

Código (ruby) [Seleccionar]
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


Eleкtro

Eres un genio de ruby jeje muxas gracias por todo

Cita de: RyogiShiki en 20 Febrero 2012, 17:43 PM
Código (ruby) [Seleccionar]
if (ARGV[0])=="-h" or "--help"
help()


Código (ruby) [Seleccionar]
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:

Código (ruby) [Seleccionar]

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!!!








RyogiShiki

#3
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:

Código (ruby) [Seleccionar]

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


Eleкtro

#4
Cita de: RyogiShiki en 23 Febrero 2012, 04:03 AM
Código (ruby) [Seleccionar]

if ARGV[0] == "-c" or ARGV[0] == "--comilla"


Gracias!


esto no me funciona:

Código (ruby) [Seleccionar]
if not (ARGV[0]) == "-c" or (ARGV[0]) == "--comilla"
print "\n ERROR.   Opcion incorrecta...\n\n"
advise()
end


Código (ruby) [Seleccionar]
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.