https://foro.gambas-es.org/viewtopic.php?f=1&t=4425
-----------------------------------
Shell
Lunes, 02 Marzo 2015, 21:21

Buscando Nombres De Archivos Por Coincidencias
-----------------------------------
Hola!.

Después de estar un poco estudiando Python. Me acordé de un modulo que usa para el manejo del sistema.
Y encontré un método para listar archivos. De esto salio la idea de este ejemplo.

La idea principal es, buscar un nombre de archivo que incluyen ciertas palabras.
Imaginar lo que sería, si esta condición se cumple y si esta también y esta...una linea algo larga de condicionales.  :roll: 

El movimiento se demuestra andando. Así que ni corto ni perezoso:

Tengo una lista de juegos de Spectrum y quería encontrar que archivos cumplían con:
- Una compañía concreta
- Estuviera en español
- Se haya producido en un año concreto

El ejemplo lo hice en consola, por ahora.

[code linenumbers=false syntax=gambas]
Public Sub Main()

Dim condiciones As String[] = ["US Gold", "(es)", "1988"]
Dim ruta_archivos As String = "~/Documentos/Ordenadores/Spectrum/Coleccion/Tzx/"
Dim fichero As String
Dim condicion As String
Dim cuenta_condiciones As Integer

For Each fichero In RDir(ruta_archivos, "*.tzx", gb.File).Sort()
  cuenta_condiciones = 0
  'Convertimos el nombre del archivo a minúscula para igualdad
  fichero = Lower(fichero)
  ' Comprobamos que se cumple todas las condiciones
  For Each condicion In condiciones
    If InStr(fichero, Lower(condicion)) <> 0 Then 
      cuenta_condiciones += 1   
    Endif
  Next
  'Si se cumplen todas las condiciones mostramos el nombre del archivo
  If cuenta_condiciones = condiciones.Length Then Print ruta_archivos & fichero 
Next

End
[/code]

Y con eso obtuve este pequeño listado:

[quote]
~/Documentos/Ordenadores/Spectrum/Coleccion/Tzx/b/beach head (1988)(dro soft - us gold)(es).tzx
~/Documentos/Ordenadores/Spectrum/Coleccion/Tzx/b/bruce lee (1988)(dro soft - us gold)(es).tzx
~/Documentos/Ordenadores/Spectrum/Coleccion/Tzx/c/charlie chaplin (1988)(erbe - us gold)(es).tzx
~/Documentos/Ordenadores/Spectrum/Coleccion/Tzx/r/raid over moscow (1988)(dro soft - us gold)(es).tzx
~/Documentos/Ordenadores/Spectrum/Coleccion/Tzx/r/road blasters (1988)(erbe - us gold)(es)(side a).tzx
~/Documentos/Ordenadores/Spectrum/Coleccion/Tzx/r/road blasters (1988)(erbe - us gold)(es)(side b).tzx
~/Documentos/Ordenadores/Spectrum/Coleccion/Tzx/r/rolling thunder (1988)(erbe - us gold)(es).tzx
~/Documentos/Ordenadores/Spectrum/Coleccion/Tzx/t/turbo outrun (1988)(erbe - us gold)(es)(side a).tzx
~/Documentos/Ordenadores/Spectrum/Coleccion/Tzx/t/turbo outrun (1988)(erbe - us gold)(es)(side b).tzx
[/quote]

Así que con un array y las condiciones en el, solucione el problema de usar una linea larga de condicionales.

Ahora mis compañero me dirán, aprende base de datos, que ya te va tocando.  :lol: 
Era un ejemplo. Y funciona!.  ;-) 

Saludos


-----------------------------------
Shell
Lunes, 02 Marzo 2015, 21:49

Re: Buscando Nombres De Archivos Por Coincidencias
-----------------------------------
Ejem, ejem..

Si me voy al lugar donde tengo el directorio de los juegos..

[code linenumbers=false syntax=bash]
ls -R | grep -i "US Gold" | grep -i "(es)" | grep 1988
[/code]

Hace lo mismo.  :roll:

Claaaaro, pero no es Gambas :!:

Ozu!, cuanto hay que estudiar! y sin base de datos ni na!.


-----------------------------------
shordi
Martes, 03 Marzo 2015, 11:24

Re: Buscando Nombres De Archivos Por Coincidencias
-----------------------------------
[quote]y sin base de datos ni na!.[/quote]

Es lo que tiene :grin:  :grin:


-----------------------------------
Shell
Martes, 03 Marzo 2015, 22:15

Re: Buscando Nombres De Archivos Por Coincidencias
-----------------------------------
Hice una mezcla de Gambas y Shell y obtuve esto:

[code linenumbers=false syntax=gambas]
'find ~/Documentos/Ordenadores/Spectrum/Coleccion/Tzx/ -iname *.tzx | grep -i "US Gold" | grep -i "(es)" | grep 1988

Public Sub Main()

Dim condiciones As String[] = ["US Gold", "(es)", "1988"]
Dim condicion As String, linea_comando, salida As String
Dim ruta_archivos As String = "~/Documentos/Ordenadores/Spectrum/Coleccion/Tzx/"

linea_comando = "find " & ruta_archivos & " -iname *.tzx"
For Each condicion In condiciones
  linea_comando &= " | grep -i " & Chr(34) & condicion & Chr(34)
Next

'Direccionamos el contenido de la linea de comandos a la variable salida
Shell linea_comando To salida
Print salida

End
[/code]

Saludos


-----------------------------------
shordi
Miercoles, 04 Marzo 2015, 09:58

Re: Buscando Nombres De Archivos Por Coincidencias
-----------------------------------
La Shell solita hace eso y más. Aquí, por ejemplo te descomprime todos los archivos .rar y te borra todos los archivos .htm de manera recursiva en el árbol de directorios desde la carpeta donde lo ejecutes:

[code linenumbers=false syntax=gambas]
Shell "find . -name \*.rar | while read f; do unrar e "$f"; rm *.htm; done" wait
[/code]

Extraído de un programa que hice de copias de seguridad hace tiempo. 

Saludos.


-----------------------------------
Shell
Miercoles, 04 Marzo 2015, 10:50

Re: Buscando Nombres De Archivos Por Coincidencias
-----------------------------------
Shordi:

Cierto, el Shell de Unix es muy potente.
El problema que tuve con ese ejemplo era que tenía que repetir  cada sentencia:

[code linenumbers=false syntax=bash]
| grep -i ....
[/code]

Por cada condición que necesitase buscar.
Creando una linea de comandos, concatenando las instrucción "grep -i" y la condición.
Toda esta linea la crea el bucle For Each.

[code linenumbers=false syntax=bash]
| grep -i "US Gold" | grep -i "(es)" | grep 1988
[/code]

( Vaya, se coló la palabra PIPE ).  :???: 

Una de las preguntas que nos podemos hacer es, si queremos hacerlo en Gambas o hacerlo en Shell.
Con Shell se abrevia, naturalmente. Nosotros no sabemos todo el código que hay detrás de cada instrucción del Shell.
Aprendemos a usarlas sin preocuparnos de su código interno. ( Otro lenguaje más que hay que aprender, mas tiempo, etc..)

Por otro lado estamos reinventando la rueda al hacerlo en Gambas. Aunque como programador de Gambas. 
¿ No te hubiera gustado crearlo en lenguaje Gambas ? ( Ciento y la madre de instrucciones ). 
En tu caso se entiende, no puedes perder tanto tiempo y te exigen un rendimiento en el trabajo.

Para el que aprende está bien poder hacerlo en Gambas. Pero esto es como todo.
A medida que vas conociendo la programación y nuevas técnicas, buscaras entre rapidez, facilidad, rendimiento y no olvidemos la limpieza del código y su comprensión.

Saludos


-----------------------------------
shordi
Miercoles, 04 Marzo 2015, 11:40

Re: Buscando Nombres De Archivos Por Coincidencias
-----------------------------------
[quote]Por otro lado estamos reinventando la rueda al hacerlo en gambas[/quote]

Eso me pasa muy a menudo pero aprendí hace tiempo a utilizar todas las herramientas que estén a mi disposición... siempre que no interfieran en mi planteamiento. Un ejemplo:
Cuando se me planteó la necesidad de una aplicación que manejase un montón de documentos, o bien pdf o bien de LibreOffice, etc. mi primera intención fué utilizar Filezilla, que es el mejor cliente FTP que conozco. Pero, dadas las características de la aplicación que manejaba, eso me complicaba extraordinariamente el mantenimiento de la aplicación (No todos los usuarios tienen derecho a ver los mismos documentos. FTP soluciona eso creando un usuario en el servidor por cada usuario que se conecta, lo cual complica el asunto de añadir usuarios, etc.) y su manejo (al intentar subir o bajar un fichero hay que hacer una llamada externa a Filezilla y paralizar la aplicación mientras, para chequear después que sí se ha subido o que se ha abortado, etc. etc.)

¿Solución? me hice mi propio cliente de FTP, el programa gbFtp es un extracto de él, que hacía todo eso de manera automática, y perfecto. Me costó reinventar la rueda, pero me divertí mucho en el proceso y aprendí un montón sobre un montón de cosas en el camino.

Eso sí, si Filezilla me hubiese servido, lo hubiese usado sin contemplaciones ni remordimientos.

Saludos


-----------------------------------
shordi
Miercoles, 04 Marzo 2015, 11:46

Re: Buscando Nombres De Archivos Por Coincidencias
-----------------------------------
Una cuestión más sobre apoyarse en herramientas externas: Las actualizaciones y cambios en tales herramientas (o su obsolescencia) pueden hacer tu programa inútil con el paso del tiempo y las versiones.
Una vez hice un manejador de pdf echo en gambas2 que no era sino un front-end gráfico para una librería llamada pdftk, si no recuerdo mal, que unía pdf, separa hojas, extraía imágenes, añadía marcas de agua, etc.

A los pocos meses se declaró obsoleta la mentada librería y al cabo de dos o tres años desapareció de los repositorios de las principales distribuciones. Mi programa a la basura, claro. Aunque han surgido desde entonces otras librerías que hacen cosas parecidas, no me he vuelto a animar a hacerlo otra vez.

Batallitas...


-----------------------------------
jsbsan
Miercoles, 04 Marzo 2015, 14:28

Re: Buscando Nombres De Archivos Por Coincidencias
-----------------------------------
[quote] para una librería llamada pdftk,[/quote]
Me suena un programa llamado asi "pdfk" y haberlo usado en algunas de mis aplicaciones... en Debian , se puede descargar sin problemas.


-----------------------------------
Shell
Miercoles, 04 Marzo 2015, 14:46

Re: Buscando Nombres De Archivos Por Coincidencias
-----------------------------------
Shordi:

Obsolescencia, desde luego es un palo para el profesional, no queda otro remedio que actualizar esa aplicación.
En mi caso, primero lo hice con Gambas, luego vi que se podía hacer desde Shell y por ultimo una mezcla de los dos.
Y así hasta mejorar lo que hecho, buscando alternativas en  Shell, actualmente.

En el caso de Gambas si es una programación general, no tendría por que quedarse obsoleto.
Mientras Gambas exista, claro.

Si la herramienta es muy importante para el programador, no tiene otra que actualizar.

Saludos


-----------------------------------
shordi
Miercoles, 04 Marzo 2015, 17:28

Re: Buscando Nombres De Archivos Por Coincidencias
-----------------------------------
[quote]no tiene otra que actualizar[/quote]

... o no. No tienes más que ver cuántos ordenadores, aún hoy día, siguen mostrando pantallas de texto ms-dos o emulador de terminal, etc. 
Si tienes un montón de aplicaciones rulando en gambas2, a lo mejor lo que te toca es "congelar" ordenadores e inculos redes para que todo siga funcionando...

Saludos.


-----------------------------------
Shell
Sabado, 07 Marzo 2015, 01:04

Re: Buscando Nombres De Archivos Por Coincidencias
-----------------------------------
Al final logre hacerlo con un Shell Script. 

[code linenumbers=false syntax=bash]
#!/bin/bash

listado=$(find ~/Emulacion/Spectrum/Coleccion/Tzx/ -iname *.tzx)
for argumento in $@;
do
	listado=$(echo "$listado"| grep -i $argumento)
done
echo "$listado" | sort -n
[/code]
Como es normal, la variable listado va almacenando el resultado por cada argumento posicional que busca  grep. 

En este caso, lo estoy usando para buscar cintas del antiguo emulador de Spectrum. (Fecha,compañía,idioma, etc) 
Incluí el directorio donde se alojan las cintas en el propio script. Se le podría pasar un directorio como argumento e incluso
una extensión de archivo. El número de argumentos posicionales aumenta.

Use $@ para que no tenga problemas con nombres con espacios.

Cómo es lógico la comodidad de una interfaz gráfica en determinados momentos es evidente.

Saludos


-----------------------------------
shordi
Sabado, 07 Marzo 2015, 01:10

Re: Buscando Nombres De Archivos Por Coincidencias
-----------------------------------
[code linenumbers=false syntax=shell]find ~/micarpeta -name "*.txt" -o -name "*.ods" [/code]

Te hace el trabajo ¿no?


-----------------------------------
Shell
Sabado, 07 Marzo 2015, 10:45

Re: Buscando Nombres De Archivos Por Coincidencias
-----------------------------------
Shordi:

Si, haría el trabajo si estas buscando un número de argumentos que conoces.En ese caso buscando archivos con extensión txt ó ods.
No conocía los operadores lógicos con la instrucción Find.

No sabes la cantidad de archivos que pueden mostrarse.¿ Y si son miles ?. :-)
Parece más compleja usando los operadores dentro de Find.

Sabiendo en este caso que busco tres coincidencias:
[code linenumbers=false syntax=bash]
find ~/Emulacion/Spectrum/Coleccion/ -name *.tzx -and -iname *commando* -and -name *1985*
[/code]

O la opción anterior:
[code linenumbers=false syntax=bash]
find ~/Emulacion/Spectrum/Coleccion/ -name *.tzx | grep -i commando | grep 1985
[/code]
Con grep la expresión ha quedado más corta. Continuare probando otras cosas.
A ver si se puede exprimir algo más. :-D

Saludos


