elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  (Solucionado) [RUBY] Renombrando un caracter ilegal
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: (Solucionado) [RUBY] Renombrando un caracter ilegal  (Leído 10,168 veces)
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.700



Ver Perfil
(Solucionado) [RUBY] Renombrando un caracter ilegal
« 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


« Última modificación: 20 Febrero 2012, 06:21 am por EleKtro H@cker » En línea


RyogiShiki


Desconectado Desconectado

Mensajes: 745


げんしけん - Hikkikomori FTW!!!


Ver Perfil WWW
Re: [BATCH] Renombrando un caracter ilegal
« Respuesta #1 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 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


« Última modificación: 19 Febrero 2012, 09:28 am por RyogiShiki » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.700



Ver Perfil
Re: [BATCH] Renombrando un caracter ilegal
« Respuesta #2 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
« Última modificación: 19 Febrero 2012, 12:54 pm por EleKtro H@cker » En línea


RyogiShiki


Desconectado Desconectado

Mensajes: 745


げんしけん - Hikkikomori FTW!!!


Ver Perfil WWW
Re: [RUBY] [BATCH] Renombrando un caracter ilegal
« Respuesta #3 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!
« Última modificación: 19 Febrero 2012, 18:32 pm por RyogiShiki » En línea

RyogiShiki


Desconectado Desconectado

Mensajes: 745


げんしけん - Hikkikomori FTW!!!


Ver Perfil WWW
Re: [RUBY] [BATCH] Renombrando un caracter ilegal
« Respuesta #4 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
En línea

WaAYa HaCK

Desconectado Desconectado

Mensajes: 292


Arduino, Android and music


Ver Perfil
Re: [RUBY] [BATCH] Renombrando un caracter ilegal
« Respuesta #5 en: 19 Febrero 2012, 23:52 pm »

Eso del ARGV[0] me parece raro, ya que argv(0) siempre ha sido el propio script.
En línea

La cacatúa yoyó es nueva en el zoo!
RyogiShiki


Desconectado Desconectado

Mensajes: 745


げんしけん - Hikkikomori FTW!!!


Ver Perfil WWW
Re: [RUBY] [BATCH] Renombrando un caracter ilegal
« Respuesta #6 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
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.700



Ver Perfil
Re: [RUBY] [BATCH] Renombrando un caracter ilegal
« Respuesta #7 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
« Última modificación: 20 Febrero 2012, 03:30 am por EleKtro H@cker » En línea


RyogiShiki


Desconectado Desconectado

Mensajes: 745


げんしけん - Hikkikomori FTW!!!


Ver Perfil WWW
Re: (Solucionado) [RUBY] Renombrando un caracter ilegal
« Respuesta #8 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.
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.700



Ver Perfil
Re: (Solucionado) [RUBY] Renombrando un caracter ilegal
« Respuesta #9 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
En línea


Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Solucionado] Separar una Cadena de Texto Caracter Por Caracter « 1 2 »
Programación Visual Basic
agus0 19 19,705 Último mensaje 5 Mayo 2011, 14:29 pm
por Psyke1
(Solucionado) [RUBY] Mostrar caracter unicode
Scripting
Eleкtro 4 2,870 Último mensaje 20 Febrero 2012, 16:18 pm
por RyogiShiki
(Solucionado) [Ruby] Colorizando texto
Scripting
Eleкtro 1 2,327 Último mensaje 20 Febrero 2012, 10:15 am
por Eleкtro
(Solucionado) [Ruby] Duda sobre FOR con operador de rango
Scripting
Eleкtro 3 2,541 Último mensaje 24 Febrero 2012, 13:42 pm
por Eleкtro
(Solucionado) [Ruby] Ayuda con rescue!
Scripting
Eleкtro 2 2,650 Último mensaje 1 Marzo 2012, 14:40 pm
por Eleкtro
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines