Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: davoker en 21 Junio 2016, 03:39 am



Título: ¿Se puede hacer este script?
Publicado por: davoker en 21 Junio 2016, 03:39 am
Cogemos 2 archivos, los comparamos buscando coincidencias en el nombre, y uno se renombra igual que el otro, me explico mejor.

Un archivo .png y otro .zip con estos nombres:

png -> andeandara.png
zip -> andeandaraXD.zip

El script compara el nombre del .png con todos los posibles .zips que haya en una carpeta, y busca en el nombre las coincidencias, una vez encuentra esa coincidencia (o varias), renombra dicho .png al mismo nombre que el .zip que concide en su mayor parte en el nombre (espero haberme explicado xD).

Un script asi es posible? alguna idea para trabajar con ello? en plan:
FC archivo1.txt archivo2.txt, que era para comparar archivos o algo asi no? no se, tengo muy dejado el batch y me esta costando retomarlo tela  ;D

Venga gracias!


Título: Re: ¿Se puede hacer este script?
Publicado por: Eleкtro en 21 Junio 2016, 11:05 am
Como poder, se puede llevar a cabo la implementación de un algoritmo home-made, o siguiendo las bases de algún algoritmo aritmético específico (el cual yo desconozco) para optimizar ese tipo de comparación.

Ahora, ¿hacerlo en Batch? ...no. Es un lenguaje demasiado limitado, es inutil tan siquiera plantearselo, e intentarlo.

Para hacerlo en cualquier otro lenguaje capacitado primero tendrías que explicar las reglas de comparación/descarte más que nada para saber como narices se deberían evaluar los caracteres y las coincidencias de strings, y también para saber si ya existe un algoritmo aritmético que te pueda servir para implementarlo como un algoritmo de programación. En fin, dar todos los detalles posibles a ese nivel. De lo contrario, sinceramente ...no se que esperas que te digamos ni hagamos.

Saludos!


Título: Re: ¿Se puede hacer este script?
Publicado por: davoker en 21 Junio 2016, 15:16 pm
Como poder, se puede llevar a cabo la implementación de un algoritmo home-made, o siguiendo las bases de algún algoritmo aritmético específico (el cual yo desconozco) para optimizar ese tipo de comparación.

Ahora, ¿hacerlo en Batch? ...no. Es un lenguaje demasiado limitado, es inutil tan siquiera plantearselo, e intentarlo.

Para hacerlo en cualquier otro lenguaje capacitado primero tendrías que explicar las reglas de comparación/descarte más que nada para saber como narices se deberían evaluar los caracteres y las coincidencias de strings, y también para saber si ya existe un algoritmo aritmético que te pueda servir para implementarlo como un algoritmo de programación. En fin, dar todos los detalles posibles a ese nivel. De lo contrario, sinceramente ...no se que esperas que te digamos ni hagamos.

Saludos!
No hombre, no espero que nadie me haga nada, no sabia que en batch esto no se podia hacer y por eso preguntaba si era posible, en el caso de que si fuera posible hacer algo asi en batch, lo que esperaba era alguna base con la que trabajar, o ideas para tener algo con lo que empezar vaya, no busco que me hagan las cosas, no va conmigo.

Si tenemos que pasar a un lenguaje como tal, se me escapa de las manos, y no sabria como dar los datos que pides mas haya de la explicacion que doy arriba.

Gracias de todas formas, un saludin.


Título: Re: ¿Se puede hacer este script?
Publicado por: Echizen en 21 Junio 2016, 16:52 pm
en bash (linux) se puede hacer. me imagino hacer un listado con los nombres de la carpeta "A" y despues ir comparando nombre por nombre con todos los archivos de la carpeta "B" en busqueda de coincidencias. obviamente el scripting para eso es bastante limitado, pero se puede hacer algo simple y funcional.

me imagino el código algo como...

Código
  1. #obtener listado
  2. LISTA=$(ls -l /carpetaA |awk '{print $9}')
  3.  
  4. #cantidad de elementos en al lista
  5. CANT=$(wc -l $LISTA |awk 'print $1')
  6.  
  7. #creamos un contador
  8. CONT=1
  9.  
  10. #bucle para recorrer el listado
  11. until [ $CONT -gt $CANT ]; do
  12.  
  13.   #obtener nombre de archivo a comparar
  14.   ARCHIVO_ACTUAL=$(echo $LISTA |sed -n '${CONT}p')
  15.  
  16.   buscar archivos en la carpeta B que contengan el nombre del archivo actual
  17.   ls /carpetaB |grep ${ARCHIVO_ACTUAL%.*}
  18.   #                                   ^   esto es para que no tome en cuenta la extensión del archivo
  19.  
  20. #
  21. # después de aca vos veras que haces con las coincidencias...
  22. #
  23. done
  24.  

asi es como yo lo encararía con bash. me imagino que en batch se debe poder hacer lo mismo, no creo que windows sea tan pobre...

Saludos!


Título: Re: ¿Se puede hacer este script?
Publicado por: Eleкtro en 21 Junio 2016, 19:44 pm
Si tenemos que pasar a un lenguaje como tal, se me escapa de las manos, y no sabria como dar los datos que pides mas haya de la explicacion que doy arriba.

Pues por ejemplo: si el nombre de archivo original se llama "andeandara", podrías intentar explicar cual de estos nombres debería seleccionarse y por qué:

  • andeandaraa
  • aandeandara
  • andeandará
  • ándeandara



me imagino que en batch se debe poder hacer lo mismo, no creo que windows sea tan pobre...

No, ese script no es facilmente reproducible. El motor RegEx de Batch es lo más limitado que puedas imaginar, solo sirve para parsear, no para transformar, por ende no existe un equivalente de sed, y de awk tampoco, al menos no de una forma tan directa, puesto que primero se debe declarar un tipo de búcle para obtener el buffer de salida del comando que sirve para listar archivos en una carpeta, y luego una variable que servirá para contar cada linea ...todo esto sin soporte nativo para Arrays ni la asignacion de la salida de un comando a una variable.
Eso es lo que vuelve tedioso a Batch, me refiero, lo que nos costaría un par de lineas de código en otro lenguaje, se convierte en 20 lineas si usamos Batch.

Pero no es cosa de Windows, sino de Batch, pues su propósito no es ser un lenguaje de programación. Windows tiene integrado el soporte para diversos lenguajes de scripting, como VBS, por ejemplo, un lenguaje en el que si que se podría elaborar un código parecido al que has publicado sin demasiadas complicaciones.

Saludos


Título: Re: ¿Se puede hacer este script?
Publicado por: davoker en 21 Junio 2016, 23:33 pm
Gracias a los 2, voy a ver que puedo hacer con tu script @Echizen, se agradece.

@Eleкtro Las variantes del nombre original serian todas las que pillase el script, es decir, si el nombre original es "andeandara.zip", y tenemos 3 archivos parecidos como "andeandara1.png, andeandaraX.png y andeandaraT.png", me valdria perfectamente que renombrara esos 3 archivos PNG igual que el ZIP orignal, pero no pueden llevar los 3 PNG el mismo nombre, si me pregunatara si quiero sobreescribir ya me preocuparia yo de la decision.

Es preferible digamos que me joda 50 archivos si con ello consigo renombrar 5000 correctamente, no se si me explico jeje

Venga un saludin, voy a probar eso a ver como lo apaño.


Título: Re: ¿Se puede hacer este script?
Publicado por: 177600531 en 22 Junio 2016, 02:42 am
No entiendo muy bien al final como quieres que se renombren los archivos, prueba con esto en python.

Código
  1. # -*- coding: utf-8 -*-
  2.  
  3. import glob
  4. import os
  5.  
  6. os.system("clear")
  7.  
  8. original = raw_input("Coincidencias # ")
  9. extensio = raw_input("Extension     # ")
  10.  
  11. b = original + "*"
  12. c = glob.glob(b)
  13.  
  14. d = len(c)
  15. print ""
  16. print "He obtenido", d, "coincidencias!"
  17. print ""
  18. procede = raw_input("Proceder? y/n # ")
  19.  
  20. if procede == "y":
  21.    e = 0
  22.    for f in c:
  23.        e += 1
  24.        g = str(e)
  25.        os.rename(f, original+g+extensio)
  26.    print "Done!"
  27. else:
  28.    pass


Título: Re: ¿Se puede hacer este script?
Publicado por: davoker en 2 Julio 2016, 03:58 am
No entiendo muy bien al final como quieres que se renombren los archivos, prueba con esto en python.

Código
  1. # -*- coding: utf-8 -*-
  2.  
  3. import glob
  4. import os
  5.  
  6. os.system("clear")
  7.  
  8. original = raw_input("Coincidencias # ")
  9. extensio = raw_input("Extension     # ")
  10.  
  11. b = original + "*"
  12. c = glob.glob(b)
  13.  
  14. d = len(c)
  15. print ""
  16. print "He obtenido", d, "coincidencias!"
  17. print ""
  18. procede = raw_input("Proceder? y/n # ")
  19.  
  20. if procede == "y":
  21.    e = 0
  22.    for f in c:
  23.        e += 1
  24.        g = str(e)
  25.        os.rename(f, original+g+extensio)
  26.    print "Done!"
  27. else:
  28.    pass
Hola, gracias amigo, mira al final encontre lo que buscaba pero ya hecho xD de hecho hay varias aplicaciones que lo hacen, y se mueven por el mundillo del arcade, Hyperspin y demas frontends, te pongo de ejemplo 2 que hacen lo que queria, Hyperspin_RomManager y Tru_Match, esta ultima ademas no es solo para cosas referentes a la emulacion arcade, vale para cualquier tipo de archivo.

Echales un vistazo si quieres, asi ves que es lo que buscaba exactamente, estos programas o te mueves por ese mundillo o no das con ellos, estan en paginas un poco cerradas, para el que las conozca dira que no, pero no das con esas paginas de casuliadad xD

Venga un saludo y gracias por la ayuda ^^


Título: Re: ¿Se puede hacer este script?
Publicado por: Poyoncio en 20 Julio 2016, 21:32 pm
Si quieres renombrar ficheros sin tener tu que decir el nombre que quieres que se les ponga puedes utilizar nombre + random.randint(0,50000) asi cada fichero seguramente tuviera un nombre distinto nose si es eso lo que buscabas.
Saludos

PD: Tambien si lo que quieres es comparar nombres de fichero poniendo la extension fuera puedes hacer un if fichero.startswith('nombre_fichero').... y que hiciera un accion  automatizando algo asi como una copia en la misma carpeta con diferente extension y borrando el fichero que tenia la extension distinta (esto va en funcion de lo que quieras que haga)