¿Se puede hacer este script?

Iniciado por davoker, 21 Junio 2016, 03:39 AM

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

davoker

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!

Eleкtro

#1
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!








davoker

Cita de: 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!
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.

Echizen

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 (bash) [Seleccionar]

#obtener listado
LISTA=$(ls -l /carpetaA |awk '{print $9}')

#cantidad de elementos en al lista
CANT=$(wc -l $LISTA |awk 'print $1')

#creamos un contador
CONT=1

#bucle para recorrer el listado
until [ $CONT -gt $CANT ]; do

   #obtener nombre de archivo a comparar
   ARCHIVO_ACTUAL=$(echo $LISTA |sed -n '${CONT}p')
   
   buscar archivos en la carpeta B que contengan el nombre del archivo actual
   ls /carpetaB |grep ${ARCHIVO_ACTUAL%.*}
   #                                   ^   esto es para que no tome en cuenta la extensión del archivo

#
# después de aca vos veras que haces con las coincidencias...
#
done


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!

Eleкtro

#4
Cita de: davoker en 21 Junio 2016, 15:16 PMSi 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




Cita de: Echizen en 21 Junio 2016, 16:52 PMme 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








davoker

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.

177600531

#6
No entiendo muy bien al final como quieres que se renombren los archivos, prueba con esto en python.

Código (python) [Seleccionar]
# -*- coding: utf-8 -*-

import glob
import os

os.system("clear")

original = raw_input("Coincidencias # ")
extensio = raw_input("Extension     # ")

b = original + "*"
c = glob.glob(b)

d = len(c)
print ""
print "He obtenido", d, "coincidencias!"
print ""
procede = raw_input("Proceder? y/n # ")

if procede == "y":
   e = 0
   for f in c:
       e += 1
       g = str(e)
       os.rename(f, original+g+extensio)
   print "Done!"
else:
   pass

davoker

Cita de: 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 (python) [Seleccionar]
# -*- coding: utf-8 -*-

import glob
import os

os.system("clear")

original = raw_input("Coincidencias # ")
extensio = raw_input("Extension     # ")

b = original + "*"
c = glob.glob(b)

d = len(c)
print ""
print "He obtenido", d, "coincidencias!"
print ""
procede = raw_input("Proceder? y/n # ")

if procede == "y":
   e = 0
   for f in c:
       e += 1
       g = str(e)
       os.rename(f, original+g+extensio)
   print "Done!"
else:
   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 ^^

Poyoncio

#8
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)
Curso de ensamblador desde cero