(Solucionado) [RUBY] Renombrando un caracter ilegal

Iniciado por Eleкtro, 19 Febrero 2012, 06:52 AM

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

Eleкtro

El problema es que tengo muchos archivos que usan este caracter: " ", Es parecido a un guión pero más largo.

No encuentro la forma de renombrar ese guión extraño por el guión normal...

Pongo como ejemplo un archivo mp3 con este nombre: "Dilemn – Always Continue.mp3"


1er intento:
Código (dos) [Seleccionar]
Rename "Dilemn – Always Continue" "Dilemn - Always Continue"
El sistema no puede encontrar el archivo especificado.
FAIL


2ndo intento:
Código (dos) [Seleccionar]
Set name=Dilemn – Always Continue.mp3
Rename "%name%" "%name:-=-%"

El sistema no puede encontrar el archivo especificado.
FAIL


3er intento:
Código (dos) [Seleccionar]
For /F "Tokens=*" %%a in ('dir /B "*.mp3"') do (rename "%%a" "LO QUE SEA")
El sistema no puede encontrar el archivo especificado.
FAIL








RyogiShiki

#1
Hola. se que lo quieres resolver en Batch, pero si es más una labor que debes hacer entonces este Script en Ruby lo soluciona:

Código (ruby) [Seleccionar]
# -*- coding: UTF-8 -*-

print "En que directorio quieres buscar: "
directory = gets.chomp
rename = 0
puts "Cambiando al directorio " + directory
Dir.chdir(directory)

puts "Espera mientras los archivos son indexados..."
puts "Esto tarda de acuerdo a la cantidad de archivos en el directorio..."
Dir.glob("**/*").each { |file|
puts "Analizando " + file
if file["\u2013"] then
puts "File: " + file + "contiene caracter ilegal"
puts "Renombrando a caracter standar '-' "
File.rename(file.to_s, file.to_s.gsub("\u2013", "-"))
puts "Archivo renombrado"
rename += 1
end
}

puts "renombrados " + rename.to_s + "archivos"


Solo debes Descargar ruby instalarlo, cuando instales asegurate de activar las opciones para agregar las variables de entorno. Guardas el Script en un archivo .rb y desde cmd lo ejecutas ruby script.rb

Espero sea de ayuda.

PS: Se logra gracias al soporte Unicode de Ruby.

Saludos


Eleкtro

#2
Gracias por el code RyogiShiki , Me podría servir pero de momento no cumple lo que necesito... A ver si me puedes ayudar a modificarlo un poco

¿Como puedo definir la ruta mediante un parámetro?

Por ejemplo necesitaria lanzar el script así desde un script BAT:
Ruby script.rb "E:\Música\Canciones\2012\"

He intentado buscar información sobre como pasar un argumento a ruby y no he encontrado ejemplos claros :S creo que quedaría así pero no estoy seguro:

Código (ruby) [Seleccionar]
# -*- coding: UTF-8 -*-

rename = 0
Dir.chdir(-1)

puts "Espera mientras los archivos son indexados..."
Dir.glob("**/*").each { |file|
puts "Analizando " + file
if file["\u2013"] then
puts "File: " + file + "contiene caracter ilegal"
puts "Renombrando a caracter standar '-' "
File.rename(file.to_s, file.to_s.gsub("\u2013", "-"))
puts "Archivo renombrado"
rename += 1
end
}

puts "renombrados " + rename.to_s + "archivos"



EDITO:
Nada, me tira este error:
1.rb:4:in `chdir': No such file or directory - 1 (Errno::ENOENT)
       from 1.rb:4:in `<main>'


CitarTo read command line args in a Ruby script, use the special Ruby array ARGV to get the information you need.

Así támpoco es:
Código (ruby) [Seleccionar]
Dir.chdir(ARGV[1])

Que raro, Esto si que me funciona:
Código (ruby) [Seleccionar]
puts ARGV

Pero esto no:
Código (ruby) [Seleccionar]
Dir.chdir("ARGV")
Dir.chdir(ARGV)
Dir.chdir.ARGV



EDITO 2:
Creo que ya se lo que pasa.
Debe ser por los slash...

Este es el argumento: C:\Users\Administrador\Desktop\Nueva carpeta

Y claro, debe quedar así:
Código (ruby) [Seleccionar]
Dir.chdir("C:/Users/Administrador/Desktop/Nueva carpeta")

Pues nada, Voy a buscar sobre como setear el argumento a una variable, y luego reemplazar los slashes de la variable xD

Espero tu ayuda  :P xDDD

PD: No se si lo parece, Pero es la primera vez que uso ruby xD


EDITO 3:
Que no se diga que no lo intento ^^

Código (ruby) [Seleccionar]
Path = ARGV
Path["\"]= "/"
puts (Path)


Se que no voy mal encaminado, Pero me da error xD

Esto támpoco:

Código (ruby) [Seleccionar]
Path.replace "\ to /"

Código (ruby) [Seleccionar]
Path.gsub("\", "/")




Y lo segundo es... Como podría pasar ese script a .EXE?

rubyscript2exe.rb ¿Es bueno o conoces algo más efectivo?
http://www.erikveen.dds.nl/rubyscript2exe/#6.0.0








RyogiShiki

#3
Bien lo has intentado realmente genial.

Como bien mencionas los parametros se obtienen a través de ARGV, ARGV viene siendo un array de Objetos. Lo que quiere decir que empieza a contar desde 0, para que te tome el argumento debes usar la expresión:
Código (ruby) [Seleccionar]
ARGV[0] De la siguiente manera:

Código (ruby) [Seleccionar]
# -*- coding: UTF-8 -*-

rename = 0
puts "Cambiando al directorio " + ARGV[0]
Dir.chdir(ARGV[0])

puts "Espere mientras los archivos son indexados..."
Dir.glob("**/*").each { |file|
puts "Analizando " + file
if file["\u2013"] then
puts "File: " + file + "contiene caracteres ilegales"
puts "Renombrando a caracter estandar '-' "
File.rename(file.to_s, file.to_s.gsub("\u2013", "-"))
puts "Archivo renombrado"
rename += 1
end
}

puts "renombrados " + rename.to_s + "archivos"


y la forma de usarlo sería:

ruby script.rb C:\path\to\folder

usas comillas cuando el path tenga algún espacio:

ruby script.rb "C:\path to\folder 1"

Rubyscript2Exe ya no se desarrolla más y es incompatible con la versión 1.9 de Ruby. Puedes usar Ocra. Puedes instalar Ocra de la siguiente manera, desde cmd:

gem install ocra

una vez hecho estoy como no tenemos librerías o gemas externas para cargar, para crear el exe agregamos esta linea como la primer linea del script:

Código (ruby) [Seleccionar]
# -*- coding: UTF-8 -*-
exit if Object.const_defined?(:Ocra)

rename = 0
puts "Cambiando al directorio" + ARGV[0]
Dir.chdir(ARGV[0])

puts "Espere mientras los archivos son indexados..."
Dir.glob("**/*").each { |file|
puts "Analizando " + file
if file["\u2013"] then
puts "File: " + file + "contiene caracteres ilegales"
puts "Renombrando a caracter estandar '-' "
File.rename(file.to_s, file.to_s.gsub("\u2013", "-"))
puts "Archivo renombrado"
rename += 1
end
}

puts "renombrados " + rename.to_s + " archivos"


lo guardamos, y simplemente ejecutamos el siguiente comando:

ocra script.rb

Y listo, ahora al lado de nuestro script tendremos el archivo script.exe

Saludos!


RyogiShiki

Hola.

Bueno pasaba a dejar esta versión que no usa indexado de archivos si no que va haciendo las comprobaciones al vuelo, lo que lo hace significativamente más rápido respecto al otro sobretodo si se usan grandes colecciones archivos. el manejo es el mismo que el anterior:

Código (ruby) [Seleccionar]
# -*- coding: UTF-8 -*-

require 'find'
exit if Object.const_defined?(:Ocra)

rename = 0
puts "Cambiando al directorio " + ARGV[0]

Find.find(ARGV[0].gsub("\\", "/").encode('utf-8')) { |path|
path = path.encode('utf-8')
puts "Analizando: " + path
if path["\u2013"] then
puts "El archivo " + path + " tiene el caracter ilegal"
puts "Renombrando con caracter lega '-' "
File.rename(path, path.gsub("\u2013", "-"))
puts "Archivo renombrado"
rename += 1
else
puts "Archivo " + path + " limpio."
end
}

puts "Fin. Renombrados #{rename} archivos"


Para hacer el exe se sigue el mismo procedimiento, esta vez la linea agregada esta despues para permitir añador la gema find. De todas formas dejo subidos los archivos, un comprimido con el script y el exe.

Descargar Archivos: http://www.mediafire.com/?yuc10oo1z3ycti3

Saludos


WaAYa HaCK

Eso del ARGV[0] me parece raro, ya que argv(0) siempre ha sido el propio script.
La cacatúa yoyó es nueva en el zoo!

RyogiShiki

Cita de: WaAYa HaCK en 19 Febrero 2012, 23:52 PM
Eso del ARGV[0] me parece raro, ya que argv(0) siempre ha sido el propio script.

Si bueno eso en C y entros lenguajes si quieres saber eso en ruby es con:

Código (ruby) [Seleccionar]
__FILE__

Saludos


Eleкtro

#7
Advertencia - mientras estabas leyendo, una nueva respuesta fue publicada. Probablemente desees revisar tu mensaje.




Verás, Lo que tengo es un BAT que llama a varias utilidades para organizar ese directorio, y una parte fundamental para que el resto de apps y el script en general funcione correctamente era modificar ese caracter ilegal

No se como agradecertelo :'S

Genial por la segunda versión del script ya que lo debo usar sobre directorios con más de 5.000 archivos cada uno, +30.000 en total

Por eso te agradezco el tiempo invertido haciendo el script pero por el motivo que comento prefiero una version "lite" que tarde menos en procesar xD:

Código (ruby) [Seleccionar]
# -*- coding: UTF-8 -*-

require 'find'
exit if Object.const_defined?(:Ocra)

rename = 0
total = 0

Find.find(ARGV[0].gsub("\\", "/").encode('utf-8')) { |path|
path = path.encode('utf-8')
if path["\u2013"] then
File.rename(path, path.gsub("\u2013", "-"))
rename += 1
else
total += 1
end
}

puts "Procesados: #{total} archivos" + " | " + "Renombrados: #{rename} archivos"


Parece funcionar bien. No se si es mucho pedir que revises mi modificación a ver si hay algún error.

Tema solucionado, gracias








RyogiShiki

Hola.!

Bien me alegra que haya sido de ayuda. Con respecto a las modificaciones un simple arreglo. la variable total no te va a devolver la cantidad de archivos analizados, sino que te va a devolver la cantdad de archivos que no fueron renombrados, o los que en su nombre no tenian el caracter ilegal, para obtener el total has de hacer la suma por fuera del condicional if:

Código (ruby) [Seleccionar]
# -*- coding: UTF-8 -*-

require 'find'
exit if Object.const_defined?(:Ocra)

rename = 0
total = 0

Find.find(ARGV[0].gsub("\\", "/").encode('utf-8')) { |path|
path = path.encode('utf-8')
if path["\u2013"] then
File.rename(path, path.gsub("\u2013", "-"))
rename += 1
end
total += 1
}

puts "Procesados: #{total} archivos" + " | " + "Renombrados: #{rename} archivos"


Saludos.


Eleкtro

Tienes razón me estaba dando cuenta de eso ahora iba a editar el script

Y esto debe quedar así:
Código (ruby) [Seleccionar]
total = -1

Salu2