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:
Rename "Dilemn – Always Continue" "Dilemn - Always Continue"
El sistema no puede encontrar el archivo especificado.
FAIL
2ndo intento:
Set name=Dilemn – Always Continue.mp3
Rename "%name%" "%name:-=-%"
El sistema no puede encontrar el archivo especificado.
FAIL
3er intento:
For /F "Tokens=*" %%a in ('dir /B "*.mp3"') do (rename "%%a" "LO QUE SEA")
El sistema no puede encontrar el archivo especificado.
FAIL
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:
# -*- 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 (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 ruby script.rb
Espero sea de ayuda.
PS: Se logra gracias al soporte Unicode de Ruby.
Saludos
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:
# -*- 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:
Dir.chdir(ARGV[1])
Que raro, Esto si que me funciona:
puts ARGV
Pero esto no:
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 carpetaY claro, debe quedar así:
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 ^^
Path = ARGV
Path["\"]= "/"
puts (Path)
Se que no voy mal encaminado, Pero me da error xD
Esto támpoco:
Path.replace "\ to /"
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)
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: ARGV[0]
De la siguiente manera:
# -*- 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:
# -*- 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!
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:
# -*- 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
Eso del ARGV[0] me parece raro, ya que argv(0) siempre ha sido el propio script.
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:
__FILE__
Saludos
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:
# -*- 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
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:
# -*- 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.
Tienes razón me estaba dando cuenta de eso ahora iba a editar el script
Y esto debe quedar así:
total = -1
Salu2
Cita de: EleKtro H@cker 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í:
total = -1
Salu2
Eso si quieres empezar el conteo desde 0
Saludos.
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:
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:
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
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:
chcp 1252>NUL
y usar este Script:
# -*- coding: UTF-8 -*-
require 'find'
exit if Object.const_defined?(:Ocra)
rename = 0
total = 0
Find.find(ARGV[0].gsub("\\", "/")) { |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
perfecto gracias d nuevo
Cita de: RyogiShiki en 20 Febrero 2012, 01:27 AM
si quieres saber eso en ruby es con:
__FILE__
Y esto solo para mostrar el "filename"
puts __FILE__.split('/').last
salu2
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.
Cita de: WaAYa HaCK en 20 Febrero 2012, 20:09 PM
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 !