Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: Eleкtro en 19 Febrero 2012, 06:52 am



Título: (Solucionado) [RUBY] Renombrando un caracter ilegal
Publicado por: Eleкtro en 19 Febrero 2012, 06:52 am
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
  1. Rename "Dilemn – Always Continue" "Dilemn - Always Continue"
El sistema no puede encontrar el archivo especificado.
FAIL


2ndo intento:
Código
  1. Set name=Dilemn – Always Continue.mp3
  2. Rename "%name%" "%name:-=-%"
El sistema no puede encontrar el archivo especificado.
FAIL


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


Título: Re: [BATCH] Renombrando un caracter ilegal
Publicado por: RyogiShiki en 19 Febrero 2012, 09:24 am
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
  1. # -*- coding: UTF-8 -*-
  2.  
  3. print "En que directorio quieres buscar: "
  4. directory = gets.chomp
  5. rename = 0
  6. puts "Cambiando al directorio " + directory
  7. Dir.chdir(directory)
  8.  
  9. puts "Espera mientras los archivos son indexados..."
  10. puts "Esto tarda de acuerdo a la cantidad de archivos en el directorio..."
  11. Dir.glob("**/*").each { |file|
  12. puts "Analizando " + file
  13. if file["\u2013"] then
  14. puts "File: " + file + "contiene caracter ilegal"
  15. puts "Renombrando a caracter standar '-' "
  16. File.rename(file.to_s, file.to_s.gsub("\u2013", "-"))
  17. puts "Archivo renombrado"
  18. rename += 1
  19. end
  20. }
  21.  
  22. puts "renombrados " + rename.to_s + "archivos"

Solo debes Descargar (http://rubyforge.org/frs/download.php/75848/rubyinstaller-1.9.3-p125.exe) 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
Código:
ruby script.rb

Espero sea de ayuda.

PS: Se logra gracias al soporte Unicode de Ruby.

Saludos


Título: Re: [BATCH] Renombrando un caracter ilegal
Publicado por: Eleкtro en 19 Febrero 2012, 12:03 pm
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:
Código:
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
  1. # -*- coding: UTF-8 -*-
  2.  
  3. rename = 0
  4. Dir.chdir(-1)
  5.  
  6. puts "Espera mientras los archivos son indexados..."
  7. Dir.glob("**/*").each { |file|
  8. puts "Analizando " + file
  9. if file["\u2013"] then
  10. puts "File: " + file + "contiene caracter ilegal"
  11. puts "Renombrando a caracter standar '-' "
  12. File.rename(file.to_s, file.to_s.gsub("\u2013", "-"))
  13. puts "Archivo renombrado"
  14. rename += 1
  15. end
  16. }
  17.  
  18. puts "renombrados " + rename.to_s + "archivos"


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

Citar
To 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
  1. Dir.chdir(ARGV[1])

Que raro, Esto si que me funciona:
Código
  1. puts ARGV

Pero esto no:
Código
  1. Dir.chdir("ARGV")
  2. Dir.chdir(ARGV)
  3. 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
  1. 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
  1. Path = ARGV
  2. Path["\"]= "/"
  3. puts (Path)

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

Esto támpoco:

Código
  1. Path.replace "\ to /"

Código
  1. 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 (http://www.erikveen.dds.nl/rubyscript2exe/#6.0.0)


Título: Re: [RUBY] [BATCH] Renombrando un caracter ilegal
Publicado por: RyogiShiki en 19 Febrero 2012, 16:43 pm
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
  1. ARGV[0]
De la siguiente manera:

Código
  1. # -*- coding: UTF-8 -*-
  2.  
  3. rename = 0
  4. puts "Cambiando al directorio " + ARGV[0]
  5. Dir.chdir(ARGV[0])
  6.  
  7. puts "Espere mientras los archivos son indexados..."
  8. Dir.glob("**/*").each { |file|
  9. puts "Analizando " + file
  10. if file["\u2013"] then
  11. puts "File: " + file + "contiene caracteres ilegales"
  12. puts "Renombrando a caracter estandar '-' "
  13. File.rename(file.to_s, file.to_s.gsub("\u2013", "-"))
  14. puts "Archivo renombrado"
  15. rename += 1
  16. end
  17. }
  18.  
  19. puts "renombrados " + rename.to_s + "archivos"

y la forma de usarlo sería:

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

usas comillas cuando el path tenga algún espacio:

Código:
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:

Código:
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
  1. # -*- coding: UTF-8 -*-
  2. exit if Object.const_defined?(:Ocra)
  3.  
  4. rename = 0
  5. puts "Cambiando al directorio" + ARGV[0]
  6. Dir.chdir(ARGV[0])
  7.  
  8. puts "Espere mientras los archivos son indexados..."
  9. Dir.glob("**/*").each { |file|
  10. puts "Analizando " + file
  11. if file["\u2013"] then
  12. puts "File: " + file + "contiene caracteres ilegales"
  13. puts "Renombrando a caracter estandar '-' "
  14. File.rename(file.to_s, file.to_s.gsub("\u2013", "-"))
  15. puts "Archivo renombrado"
  16. rename += 1
  17. end
  18. }
  19.  
  20. puts "renombrados " + rename.to_s + " archivos"

lo guardamos, y simplemente ejecutamos el siguiente comando:

Código:
ocra script.rb

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

Saludos!


Título: Re: [RUBY] [BATCH] Renombrando un caracter ilegal
Publicado por: RyogiShiki en 19 Febrero 2012, 23:15 pm
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
  1. # -*- coding: UTF-8 -*-
  2.  
  3. require 'find'
  4. exit if Object.const_defined?(:Ocra)
  5.  
  6. rename = 0
  7. puts "Cambiando al directorio " + ARGV[0]
  8.  
  9. Find.find(ARGV[0].gsub("\\", "/").encode('utf-8')) { |path|
  10. path = path.encode('utf-8')
  11. puts "Analizando: " + path
  12. if path["\u2013"] then
  13. puts "El archivo " + path + " tiene el caracter ilegal"
  14. puts "Renombrando con caracter lega '-' "
  15. File.rename(path, path.gsub("\u2013", "-"))
  16. puts "Archivo renombrado"
  17. rename += 1
  18. else
  19. puts "Archivo " + path + " limpio."
  20. end
  21. }
  22.  
  23. 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


Título: Re: [RUBY] [BATCH] Renombrando un caracter ilegal
Publicado por: 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.


Título: Re: [RUBY] [BATCH] Renombrando un caracter ilegal
Publicado por: RyogiShiki en 20 Febrero 2012, 01:27 am
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
  1. __FILE__

Saludos


Título: Re: [RUBY] [BATCH] Renombrando un caracter ilegal
Publicado por: Eleкtro en 20 Febrero 2012, 03:21 am
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
  1. # -*- coding: UTF-8 -*-
  2.  
  3. require 'find'
  4. exit if Object.const_defined?(:Ocra)
  5.  
  6. rename = 0
  7. total = 0
  8.  
  9. Find.find(ARGV[0].gsub("\\", "/").encode('utf-8')) { |path|
  10. path = path.encode('utf-8')
  11. if path["\u2013"] then
  12. File.rename(path, path.gsub("\u2013", "-"))
  13. rename += 1
  14. else
  15. total += 1
  16. end
  17. }
  18.  
  19. 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


Título: Re: (Solucionado) [RUBY] Renombrando un caracter ilegal
Publicado por: RyogiShiki en 20 Febrero 2012, 03:43 am
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
  1. # -*- coding: UTF-8 -*-
  2.  
  3. require 'find'
  4. exit if Object.const_defined?(:Ocra)
  5.  
  6. rename = 0
  7. total = 0
  8.  
  9. Find.find(ARGV[0].gsub("\\", "/").encode('utf-8')) { |path|
  10. path = path.encode('utf-8')
  11. if path["\u2013"] then
  12. File.rename(path, path.gsub("\u2013", "-"))
  13. rename += 1
  14. end
  15. total += 1
  16. }
  17.  
  18. puts "Procesados: #{total} archivos" + " | " + "Renombrados: #{rename} archivos"
  19.  

Saludos.


Título: Re: (Solucionado) [RUBY] Renombrando un caracter ilegal
Publicado por: Eleкtro en 20 Febrero 2012, 03:47 am
Tienes razón me estaba dando cuenta de eso ahora iba a editar el script

Y esto debe quedar así:
Código
  1. total = -1

Salu2


Título: Re: (Solucionado) [RUBY] Renombrando un caracter ilegal
Publicado por: RyogiShiki en 20 Febrero 2012, 03:57 am
Tienes razón me estaba dando cuenta de eso ahora iba a editar el script

Y esto debe quedar así:
Código
  1. total = -1

Salu2

Eso si quieres empezar el conteo desde 0

Saludos.


Título: Re: (Solucionado) [RUBY] Renombrando un caracter ilegal
Publicado por: Eleкtro en 20 Febrero 2012, 04:08 am
Mierd@, Ahora resulta que no me funciona   :-\

Ruta: E:\Música\Canciones\2009\Electro

Supongo que es por el caracter "ú" de la ruta...

¿Se puede arreglar?

1er intento:
Código:
renamer-.rb "E:\Música\Canciones\2009\Electro"

C:/Users/Administrador/AppData/Local/Temp/ocrBAA2.tmp/lib/ruby/1.9.1/find.rb:38:in `block in find': No such file or directory (Errno::ENOENT)
        from C:/Users/Administrador/AppData/Local/Temp/ocrBAA2.tmp/lib/ruby/1.9.1/find.rb:38:in `collect!'
        from C:/Users/Administrador/AppData/Local/Temp/ocrBAA2.tmp/lib/ruby/1.9.1/find.rb:38:in `find'
        from C:/Users/Administrador/AppData/Local/Temp/ocrBAA2.tmp/src/1.rb:9:in `<main>'


2ndo intento:
Código:
renamer-.rb "E:\M£sica\Canciones\2009\Electro"

C:/Users/Administrador/AppData/Local/Temp/ocr19A3.tmp/lib/ruby/1.9.1/find.rb:56:in `join': incompatible character encodings: UTF-8 and Windows-1252 (Encoding::CompatibilityError)
        from C:/Users/Administrador/AppData/Local/Temp/ocr19A3.tmp/lib/ruby/1.9.1/find.rb:56:in `block (2 levels) in find'
        from C:/Users/Administrador/AppData/Local/Temp/ocr19A3.tmp/lib/ruby/1.9.1/find.rb:54:in `reverse_each'
        from C:/Users/Administrador/AppData/Local/Temp/ocr19A3.tmp/lib/ruby/1.9.1/find.rb:54:in `block in find'
        from C:/Users/Administrador/AppData/Local/Temp/ocr19A3.tmp/lib/ruby/1.9.1/find.rb:40:in `catch'
        from C:/Users/Administrador/AppData/Local/Temp/ocr19A3.tmp/lib/ruby/1.9.1/find.rb:40:in `find'
        from C:/Users/Administrador/AppData/Local/Temp/ocr19A3.tmp/src/1.rb:9:in `<main>'

Siento alargar tanto el tema


Título: Re: Ayuda xD [RUBY] Renombrando un caracter ilegal
Publicado por: RyogiShiki en 20 Febrero 2012, 05:28 am
Al parecer es culpa del cmd de Windows, que no está pasando los argumentos encodeados en utf-8 la solución usar este comando antes de correr el Script:

Código:
chcp 1252>NUL

y usar este Script:

Código
  1. # -*- coding: UTF-8 -*-
  2.  
  3. require 'find'
  4. exit if Object.const_defined?(:Ocra)
  5.  
  6. rename = 0
  7. total = 0
  8.  
  9. Find.find(ARGV[0].gsub("\\", "/")) { |path|
  10. path = path.encode('utf-8')
  11. if path["\u2013"] then
  12. File.rename(path, path.gsub("\u2013", "-"))
  13. rename += 1
  14. end
  15. total += 1
  16. }
  17.  
  18. puts "Procesados: #{total} archivos" + " | " + "Renombrados: #{rename} archivos"

Saludos


Título: Re: Ayuda xD [RUBY] Renombrando un caracter ilegal
Publicado por: Eleкtro en 20 Febrero 2012, 06:20 am
perfecto gracias d nuevo


Título: Re: [RUBY] [BATCH] Renombrando un caracter ilegal
Publicado por: Eleкtro en 20 Febrero 2012, 09:15 am
si quieres saber eso en ruby es con:
Código
  1. __FILE__

Y esto solo para mostrar el "filename"
Código
  1. puts __FILE__.split('/').last

salu2


Título: Re: (Solucionado) [RUBY] Renombrando un caracter ilegal
Publicado por: WaAYa HaCK en 20 Febrero 2012, 20:09 pm
En python, importando el módulo sys , está el sys.argv(0). Y para lo del archivo, os.path.basename("ruta/de/cualquier/cosa.fap") devuelve el archivo y su extensión. Si sólo quieres un nombre, mediante RegEx se puede.

Por cierto, EleKtro H@cker, si te interesa seguir aprendiendo Python, tengo un script para pasar archivos por internet, hecho por mí durante dos días de clase  ;) Si quieres, posteo el code y lo explico.


Título: Re: (Solucionado) [RUBY] Renombrando un caracter ilegal
Publicado por: Eleкtro en 21 Febrero 2012, 02:59 am
Por cierto, EleKtro H@cker, si te interesa seguir aprendiendo Python, tengo un script para pasar archivos por internet, hecho por mí durante dos días de clase  ;) Si quieres, posteo el code y lo explico.

Claro que me interesa, Se que hago muy mal usando ruby y python a la vez sin haber aprendido uno de los 2, Pero igual de los 2 se tiene mucho que aprender, Ruby me está gustando mucho.

Espero tu script

Salu2 !