Tasker Para hablar de todo lo relacionado con la aplicación tasker

Respuesta
 
Herramientas
  #41  
Viejo 24/02/16, 13:25:18
Array

[xs_avatar]
Caravantes Caravantes no está en línea
Usuario muy activo
· Votos compra/venta: (1)
 
Fecha de registro: feb 2011
Mensajes: 2,200
Modelo de smartphone: Samsung Galaxy S9
Tu operador: Lowi
 Cita: Originalmente Escrito por WillyWeb Ver Mensaje
A2: Establecer variable [ Nombre:%par1 A:/sdcard/tmp ] Si (if) [ %caller1 ~ ui ]
Sí, a eso me refería. Yo lo proponía con una variable de usuario porque no sabía que hubiese una variable de sistema que contuviese esa información de que la tarea ha sido lanzada manualmente. Otra cosa que me has enseñado; gracias.

Sería estupendo que la tarea pudiera detectar (y eliminar) archivos duplicados en varias carpetas. A estas alturas no dudo de que también serás capaz de superar ese reto. Seguimos atentos a tus mensajes.
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
Responder Con Cita
Los siguientes 2 usuarios han agradecido a Caravantes su comentario:


  #42  
Viejo 24/02/16, 19:55:46
Array

[xs_avatar]
WillyWeb WillyWeb no está en línea
Usuario muy activo
 
Fecha de registro: dic 2008
Localización: Hoy aquí y mañana allí
Mensajes: 2,067
Modelo de smartphone: OnePlus 3T | Xiaomi 9T Pro
Tu operador: Vodafone
 Cita: Originalmente Escrito por Caravantes Ver Mensaje
... no sabía que hubiese una variable de sistema que contuviese esa información de que la tarea ha sido lanzada manualmente.
Esto ya lo he contado en otras conversaciones, pero lo repito aquí para disipar cualquier duda al respecto.

La variable %caller es un array creado/mantenido por Tasker que guarda la secuencia de llamadas entre perfiles/escenas/tareas/etc. Cada elemento de ese array tiene la forma...

callertype(=callername(:subcallername))

Dependiendo del valor de "callertype" (profile, scene, ui, launch, notification, external, task) en los otros dos valores puede aparecer diferente información.

Por ejemplo, si consultas esa variable desde una tarea lanzada por la entrada de un perfil podrías ver algo así...

profile=enter:PerfilCasa

Consultando cada elemento del array %caller una subtarea que sea llamada desde una tarea a su vez llamada desde un perfil podría saber exactamente quién la ha sacado de su letargo.

 Cita: Originalmente Escrito por Caravantes Ver Mensaje
Sería estupendo que la tarea pudiera detectar (y eliminar) archivos duplicados en varias carpetas...
Quería usar comandos de consola (un pequeño script en Bash) porque creo que con eso se puede ganar algo de tiempo (no mucho, la verdad), pero cada vez que intento algo me encuentro con que el shell de Android no soporta lo que necesito.

Dejando el uso de la consola a un lado (de momento) ya tengo resuelto el tema de procesar/comparar varias carpetas.

Al tema...

Código:
BorraDuplicados (666)
	A1: Destino (de goto)
<Esta tarea elimina los posibles archivos duplicados de uno o varios directorios. Se puede usar como subtarea, poniendo en el par1 la lista de directorios separados por comas, y en el par2 el/los tipo(s) de archivos a procesar. La tarea devuelve cuatro valores separados por comas: archivos procesados, archivos borrados, bytes borrados, milisegundos empleados> 
	A2: Establecer variable [ Nombre:%par1 A:/sdcard/tmp1,/sdcard/tmp2 ] Si (if) [ %caller1 ~ ui ]
	A3: Establecer variable [ Nombre:%par2 A:*.jpeg/*.jpg ] Si (if) [ %caller1 ~ ui ]
	A4: Devolver [ Valor:PARX Detener:Encendido ] Si (if) [ %par1 No ajust. | %par2 No ajust. ]
	A5: Establecer variable [ Nombre:%tictac A:%TIMEMS ] 
	A6: Separar variable [ Nombre:%par1 Separador:, ] 
	A7: For [ Variable:%carpeta Ítems:%par1() ] 
	A8: Listar archivos [ Directorio:%carpeta Coincidir:%par2 Variable:%lista Continuar Tarea Tras Error:Encendido ] 
	A9: For [ Variable:%archivo Ítems:%lista() ] 
	A10: Probar Archivo [ Tipo:Tamaño Datos:%archivo Almacenar Resultado en:%bytes Continuar Tarea Tras Error:Encendido ] 
	A11: Sumar a variable [ Nombre:%chk Valor:1 ] 
	A12: Establecer variable [ Nombre:%archivos(%chk) A:<b>%bytes</b><a>%archivo</a> ] 
	A13: End For 
	A14: End For 
	A15: Devolver [ Valor:VACIO Detener:Encendido ] Si (if) [ %archivos(#) = 0 ]
	A16: Procesar Array [ Variable:%archivos Tipo:Orden Alfabético ] 
	A17: Establecer variable [ Nombre:%finchk A:%archivos(#)-1 Calcular:Encendido ] 
	A18: Establecer variable [ Nombre:%filesbor A:0 Calcular:Apagado ] 
	A19: Establecer variable [ Nombre:%bytesbor A:0 Calcular:Apagado ] 
	A20: For [ Variable:%chk Ítems:1:%finchk ] 
	A21: Establecer variable [ Nombre:%sigchk A:%chk+1 Calcular:Encendido ] 
	A22: Establecer variable [ Nombre:%archivos A:%archivos(%chk) %archivos(%sigchk) ] 
	A23: Buscar y Reemplazar Contenido de Variable [ Variable:%archivos Buscar:(?<=<b>).*?(?=</b>) Almacenar Coincidencias En:%bytes ] 
	A24: Si (if) [ %bytes1 = %bytes2 ]
	A25: Buscar y Reemplazar Contenido de Variable [ Variable:%archivos Buscar:(?<=<a>).*?(?=</a>) Almacenar Coincidencias En:%file ] 
	A26: Ejecutar consola [ Comando:cmp %file1 %file2 Almacenar Salida En:%salida Continuar Tarea Tras Error:Encendido ] 
	A27: Si (if) [ %salida No ajust. ]
	A28: Sumar a variable [ Nombre:%filesbor Valor:1 ] 
	A29: Sumar a variable [ Nombre:%bytesbor Valor:%bytes1 ] 
	A30: Eliminar archivo [ Archivo:%file1 Continuar Tarea Tras Error:Encendido ] 
	A31: Fin si (End if) 
	A32: Fin si (End if) 
	A33: End For 
	A34: Establecer variable [ Nombre:%tictac A:%TIMEMS-%tictac Calcular:Encendido ] 
	A35: Flash [ Texto:%archivos(#),%filesbor,%bytesbor,%tictac Largo:Encendido ] Si (if) [ %caller1 ~ ui ]
	A36: Devolver [ Valor:%archivos(#),%filesbor,%bytesbor,%tictac Detener:Encendido ]
Los cambios están entre A6 y A15. En pocas palabras consisten en partir %par1 para crear un array con la lista de carpetas (A6) y procesar cada carpeta (A7/A14) para componer un array de pares bytes#archivo con todos los archivos de todas las carpetas (A9/A13). El resto sigue igual que en la versión "mono-carpeta".

Esta vez he dejado el mecanismo que permite usar la tarea directamente en el UI, o como una subtarea, sin tener que tocar nada. En A2 se pone la lista de carpetas y en A3 el patrón de archivos, le das al PLAY y a funcionar. Si vais a tocar cosas desactivar A30 para evitar borrar cosas accidentalmente.

Posibles mejoras...

Al procesar/comparar varias carpetas poder decidir en cuál de ellas se deja el archivo si se encuentra un duplicado. ¿Podría ser interesante? ... menuda pregunta más tonta
__________________
Miembro del equipo que promueve el [Subforo de Tasker]

Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino)
Responder Con Cita
Los siguientes 3 usuarios han agradecido a WillyWeb su comentario:
[ Mostrar/Ocultar listado de agradecimientos ]
  #43  
Viejo 24/02/16, 22:06:42
Array

[xs_avatar]
leromaro leromaro no está en línea
Miembro del foro
 
Fecha de registro: ago 2014
Localización: Chascomús, Argentina
Mensajes: 245
Modelo de smartphone: Xiaomi Mi A3
Tu operador: Claro
Excelente tarea han creado!!!! He seguido el hilo día a día y realmente quedé impresionado (cómo en tantas otras ocasiones) con los que algunos pueden hacer con Tasker y sus conocimientos. Uno aprende un poquito cada día, pero el que está limitado de base en ciertos aspectos informáticos (como es mi caso) no puede más que maravillarse. Felicitaciones!!!
Responder Con Cita
Los siguientes 2 usuarios han agradecido a leromaro su comentario:
  #44  
Viejo 24/02/16, 22:17:18
Array

[xs_avatar]
WillyWeb WillyWeb no está en línea
Usuario muy activo
 
Fecha de registro: dic 2008
Localización: Hoy aquí y mañana allí
Mensajes: 2,067
Modelo de smartphone: OnePlus 3T | Xiaomi 9T Pro
Tu operador: Vodafone
Lo importante (realmente lo más importante) es que entiendas lo que hace cada instrucción de la tarea. Nadie nace sabiendo y ser capaz de seguir el desarrollo de una idea como esta es el primer paso para aprender.
__________________
Miembro del equipo que promueve el [Subforo de Tasker]

Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino)
Responder Con Cita
Gracias de parte de:
  #45  
Viejo 24/02/16, 23:00:42
Array

[xs_avatar]
Mitrhandir Mitrhandir no está en línea
Usuario muy activo
 
Fecha de registro: ene 2014
Localización: Burrifornia
Mensajes: 910
Modelo de smartphone: Huawei Ascend G7
Tu operador: Yoigo
WillyWeb, lo que has creado me viene muy grande! Tienes mi admiración! Ahora a ver cómo acomodo esto en mi tasker...
Responder Con Cita
Gracias de parte de:
  #46  
Viejo 24/02/16, 23:11:42
Array

[xs_avatar]
leromaro leromaro no está en línea
Miembro del foro
 
Fecha de registro: ago 2014
Localización: Chascomús, Argentina
Mensajes: 245
Modelo de smartphone: Xiaomi Mi A3
Tu operador: Claro
 Cita: Originalmente Escrito por WillyWeb Ver Mensaje
Lo importante (realmente lo más importante) es que entiendas lo que hace cada instrucción de la tarea. Nadie nace sabiendo y ser capaz de seguir el desarrollo de una idea como esta es el primer paso para aprender.
Exacto, al tener todo ordenado se entiende, al ir siguiendo como van resolviendo, se entiende, pero el camino al resultado es muy complejo.
Responder Con Cita
Gracias de parte de:
  #47  
Viejo 25/02/16, 08:29:23
Array

[xs_avatar]
WillyWeb WillyWeb no está en línea
Usuario muy activo
 
Fecha de registro: dic 2008
Localización: Hoy aquí y mañana allí
Mensajes: 2,067
Modelo de smartphone: OnePlus 3T | Xiaomi 9T Pro
Tu operador: Vodafone
 Cita: Originalmente Escrito por albalatvs Ver Mensaje
WillyWeb, lo que has creado me viene muy grande! ... Ahora a ver cómo acomodo esto en mi tasker
¿Muy grande? ¿qué parte no entiendes?

Y, ¿cómo metes eso en tu Tasker? ... pues paso a paso

-Creas esa tarea directamente en la pestaña "TAREAS". Sólo tienes que leer cada línea, buscar la acción y poner los parámetros que aparecen en la descripción.

-Ahora ya puedes crear ese perfil con un contexto de hora...
  • Como tarea pones un "Realizar tarea".
  • En esa acción pulsas la lupa de "Nombre" y seleccionas la tarea de eliminar duplicados.
  • En "Parámetro1" pones la/las carpetas que quieres procesar separadas por comas.
  • En "Parámetro2" pones los tipos de archivo que quieres procesar separados por barras.

Suponiendo que quieres limpiar de duplicados las carpetas de fotos de WhatsApp tendrías que poner algo como esto...

Parámetro1...

/sdcard/WhatsApp/Media/WhatsApp Images,/sdcard/WhatsApp/Media/WhatsApp Images/Sent

Parámetro2...

*.jpg/*.jpeg/*.gif

Si quieres limpiar de duplicados las carpetas de vídeos de WhatsApp tendrías que poner algo como esto...

Parámetro1...

/sdcard/WhatsApp/Media/WhatsApp Video,/sdcard/WhatsApp/Media/WhatsApp Video/Sent

Parámetro2...

*.3gp/*.mp4

Ojo, que puede que en tu dispositivo la memoria interna no se llame "sdcard".
__________________
Miembro del equipo que promueve el [Subforo de Tasker]

Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino)
Responder Con Cita
Los siguientes 2 usuarios han agradecido a WillyWeb su comentario:
  #48  
Viejo 25/02/16, 08:44:38
Array

[xs_avatar]
WillyWeb WillyWeb no está en línea
Usuario muy activo
 
Fecha de registro: dic 2008
Localización: Hoy aquí y mañana allí
Mensajes: 2,067
Modelo de smartphone: OnePlus 3T | Xiaomi 9T Pro
Tu operador: Vodafone
 Cita: Originalmente Escrito por leromaro Ver Mensaje
Exacto, al tener todo ordenado se entiende, al ir siguiendo como van resolviendo, se entiende, pero el camino al resultado es muy complejo.
En Tasker se escriben programas, y programar no es más que automatizar un proceso que normalmente haces de forma manual. En este caso lo que haces manualmente es comparar dos fotos para "ver" si son iguales. Una máquina no puede "ver" como tú lo haces, así que tienes que buscar una alternativa a esa visión humana. En ese punto entra la comparación binaria (comprobar que cada punto de una imagen es exactamente igual que el de la otra).

Una vez resuelto el problema de la "visión" sólo tienes que plasmar en acciones de Tasker lo que haces manualmente de forma inconsciente...

-Buscas la lista de archivos y la ordenas por tamaños para verificar a golpe de vista si dos archivos pueden ser iguales.
-Si encuentras dos posibles duplicados abres cada imagen para "ver" (comparar en binario) si realmente son la misma.
-Si resulta que son la misma borras una de ellas.

Eso es todo.
__________________
Miembro del equipo que promueve el [Subforo de Tasker]

Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino)
Responder Con Cita
Gracias de parte de:
  #49  
Viejo 25/02/16, 10:33:19
Array

[xs_avatar]
ruco1980 ruco1980 no está en línea
Miembro del foro
 
Fecha de registro: abr 2012
Localización: Alicante
Mensajes: 390
Modelo de smartphone: Lenovo k3 Note Lemon
Tu operador: Simyo
Enhorabuena @WillyWeb...muy buen trabajo...y enhorabuena también a @Caravantes por sus aportaciones e ideas...
Me quito el sombrero ante vosotros....
En cuanto me tome la pastillita de NZT me pongo a transcribir la tarea
@mlsir......hay que ir retomando las buenas costumbres....WillyWeb se ha ganado la copa y hay que subir la tarea al recopilatorio

Responder Con Cita
  #50  
Viejo 25/02/16, 10:41:33
Array

[xs_avatar]
WillyWeb WillyWeb no está en línea
Usuario muy activo
 
Fecha de registro: dic 2008
Localización: Hoy aquí y mañana allí
Mensajes: 2,067
Modelo de smartphone: OnePlus 3T | Xiaomi 9T Pro
Tu operador: Vodafone
 Cita: Originalmente Escrito por ruco1980 Ver Mensaje
En cuanto me tome la pastillita de NZT me pongo a transcribir la tarea...
Calla que descubres mi secreto.

 Cita: Originalmente Escrito por ruco1980 Ver Mensaje
...WillyWeb se ha ganado la copa y hay que subir la tarea al recopilatorio
Espera un poco que me queda por añadir la mejora que yo mismo he propuesto para priorizar las carpetas... mira que soy bocas

Por cierto, en el tema de la comparación binaria me he decantado por el comando "cmp" en vez del "md5" porque con "cmp" la tarea es un 60% más rápida. El tema es que con el sistema md5 se requieren más acciones y dos procesos binarios (uno por archivo) mientras que con el sistema cmp se hace todo con un par de acciones y un único proceso binario.
__________________
Miembro del equipo que promueve el [Subforo de Tasker]

Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino)

Última edición por WillyWeb Día 25/02/16 a las 12:08:24.
Responder Con Cita
Gracias de parte de:
  #51  
Viejo 25/02/16, 13:08:49
Array

[xs_avatar]
Caravantes Caravantes no está en línea
Usuario muy activo
· Votos compra/venta: (1)
 
Fecha de registro: feb 2011
Mensajes: 2,200
Modelo de smartphone: Samsung Galaxy S9
Tu operador: Lowi
Todavía no he analizado con todo detalle la tarea que compara archivos de dos carpetas, tiene una pinta fantástica. ¿Se podrían procesar tres o más carpetas?

 Cita: Originalmente Escrito por WillyWeb Ver Mensaje
me queda por añadir la mejora que yo mismo he propuesto para priorizar las carpetas
En caso de que %par1 incluya varias carpetas a comparar, podría ser tan "simple" como borrar siempre el archivo de la primera carpeta que se haya indicado en %par1, y mantener el archivo de la segunda incluída en %par1. Porsupuesto luego queda la dificultad de mantener el control sobre cuál archivo es de cuál carpeta y cuál es su orden de prioridad. Tal vez se podría hacer añadiendo al array un tercer dato con una referencia numérica respecto a la prioridad de borrado, algo así:
<b>bytes</b><a>archivo</a><p>prioridad</p>
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
Responder Con Cita
  #52  
Viejo 25/02/16, 13:39:23
Array

[xs_avatar]
WillyWeb WillyWeb no está en línea
Usuario muy activo
 
Fecha de registro: dic 2008
Localización: Hoy aquí y mañana allí
Mensajes: 2,067
Modelo de smartphone: OnePlus 3T | Xiaomi 9T Pro
Tu operador: Vodafone
 Cita: Originalmente Escrito por Caravantes Ver Mensaje
Todavía no he analizado con todo detalle la tarea que compara archivos de dos carpetas, tiene una pinta fantástica. ¿Se podrían procesar tres o más carpetas?
Las que necesites. Las pruebas las estoy haciendo con tres y funciona perfectamente.

 Cita: Originalmente Escrito por Caravantes Ver Mensaje
En caso de que %par1 incluya varias carpetas a comparar, podría ser tan "simple" como borrar siempre el archivo de la primera carpeta que se haya indicado en %par1, y mantener el archivo de la segunda incluída en %par1. Porsupuesto luego queda la dificultad de mantener el control sobre cuál archivo es de cuál carpeta y cuál es su orden de prioridad. Tal vez se podría hacer añadiendo al array un tercer dato con una referencia numérica respecto a la prioridad de borrado, algo así:
<b>bytes</b><a>archivo</a><p>prioridad</p>
Esa es la idea, pero se me ha ocurrido un sistema más flexible que funciona con cualquier número de carpetas. En lo que tenga un rato lo pruebo y os cuento.
__________________
Miembro del equipo que promueve el [Subforo de Tasker]

Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino)
Responder Con Cita
  #53  
Viejo 25/02/16, 16:54:05
Array

[xs_avatar]
Caravantes Caravantes no está en línea
Usuario muy activo
· Votos compra/venta: (1)
 
Fecha de registro: feb 2011
Mensajes: 2,200
Modelo de smartphone: Samsung Galaxy S9
Tu operador: Lowi
 Cita: Originalmente Escrito por WillyWeb Ver Mensaje
se me ha ocurrido un sistema más flexible que funciona con cualquier número de carpetas
Quizá no me he explicado bien. Si procesas dos o tres o más carpetas, siempre puedes dar prioridad (de borrado) a la que has escrito primero respecto a cualquier otra carpeta que esté escrita después (en %par1): carpeta1,carpeta2,carpeta3,carpeta4

De este modo, si tienes coincidencia con tres archivos de distintas carpetas

<b>1024</b><a>file1</a><p>3</p>
<b>1024</b><a>file22</a><p>4</p>
<b>1024</b><a>file999</a><p>1</p>

En ese caso habría que empezar borrando carpeta1/file999 que es el que tiene la prioridad de borrado más alta (1). Luego habría que borrar carpeta3/file1 que es el otro que tiene mayor prioridad (3). Y en este ejemplo habría que dejar sin borrar carpeta4/file22 que es el que tiene menor prioridad de borrado (4). En este supuesto no hay ningún archivo idéntico en la carpeta2 y por eso no aparece ningún archivo con prioridad 2.

También podría ocurrir que hubiese varios archivos iguales en la misma carpeta, y en ese caso me parece irrelevante que se borre uno u otro, así que borraría por orden alfabético para dejar vivo el último de ellos (o al revés).
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
Responder Con Cita
  #54  
Viejo 25/02/16, 18:21:10
Array

[xs_avatar]
WillyWeb WillyWeb no está en línea
Usuario muy activo
 
Fecha de registro: dic 2008
Localización: Hoy aquí y mañana allí
Mensajes: 2,067
Modelo de smartphone: OnePlus 3T | Xiaomi 9T Pro
Tu operador: Vodafone
 Cita: Originalmente Escrito por Caravantes Ver Mensaje
... siempre puedes dar prioridad (de borrado) a la que has escrito primero respecto a cualquier otra carpeta que esté escrita después (en %par1): carpeta1,carpeta2,carpeta3,carpeta4
Eso es cierto con "esas" carpetas que has puesto como ejemplo. Pero si la lista de carpetas es así...

/sdcard/CarpetaUno,/sdscard/CarpetaDos,/sdcard/CarpetaTres

...al ordenar los archivos los primeros serán los de "CarpetaDos", luego los de "CarpetaTres" y al final los de "CarpetaUno". Recuerda que se ordenan alfabéticamente.

 Cita: Originalmente Escrito por Caravantes Ver Mensaje
De este modo, si tienes coincidencia con tres archivos de distintas carpetas

<b>1024</b><a>file1</a><p>3</p>
<b>1024</b><a>file22</a><p>4</p>
<b>1024</b><a>file999</a><p>1</p>

En ese caso habría que empezar borrando carpeta1/file999 que es el que tiene la prioridad de borrado más alta (1). Luego habría que borrar carpeta3/file1 que es el otro que tiene mayor prioridad (3). Y en este ejemplo habría que dejar sin borrar carpeta4/file22 que es el que tiene menor prioridad de borrado (4). En este supuesto no hay ningún archivo idéntico en la carpeta2 y por eso no aparece ningún archivo con prioridad 2.
No te discuto la lógica de lo que dices, pero decidir qué carpeta tiene más prioridad requiere acciones adicionales dentro del bucle que busca los duplicados, lo que implica más tiempo de proceso, y eso es algo que debemos evitar.

Y ademas la tarea no funciona de esa manera.

El grueso del trabajo lo hace la ordenación del array, que se encarga de "juntar" los archivos candidatos a ser eliminados. Eso es lo que permite que, con una sola pasada y comparando sólo dos archivos cada vez (no varios a visa de pájaro), podamos decidir si realmente son iguales y borrar uno de los dos.

Lo que se me ha ocurrido sigue dejando el grueso del trabajo en manos de la ordenación, no tiene impacto en el tiempo de proceso y sólo es necesario añadir una acción fuera del bucle principal.
__________________
Miembro del equipo que promueve el [Subforo de Tasker]

Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino)
Responder Con Cita
  #55  
Viejo 25/02/16, 22:31:05
Array

[xs_avatar]
WillyWeb WillyWeb no está en línea
Usuario muy activo
 
Fecha de registro: dic 2008
Localización: Hoy aquí y mañana allí
Mensajes: 2,067
Modelo de smartphone: OnePlus 3T | Xiaomi 9T Pro
Tu operador: Vodafone
Menuda locura de semana. Pido disculpas de nuevo por esta sucesión de capítulos para solucionar algo que no es especialmente complicado.

Al tema...

Como ya he comentado la ordenación alfabética del array de pares bytes#archivo nos hace el 99% del trabajo. Suponiendo que tenemos una lista de carpetas tal que así...

/CarpetaB,/CarpetaC,/CarpetaA

Y si tenemos archivos candidatos a ser borrados en cada una de ellas el array quedaría así...

<b>12345</b><a>/CarpetaA/IMG20160225-0099.jpg</a>
<b>12345</b><a>/CarpetaB/IMG20160225-0103.jpg</a>
<b>12345</b><a>/CarpetaC/IMG20160225-0041.jpg</a>

La rutina que busca los duplicados avanza por la lista comparando cada archivo con el siguiente. Si son iguales se borra el primer archivo de los dos comparados. La secuencia sigue hasta llegar al penúltimo archivo de la lista que se compara con el último. Simple como el mecanismo de un chupete.

Aplicando ese sistema a esos tres archivos que he puesto de ejemplo se eliminarían los dos primero y quedará el tercero. Podría valer así ya que de los tres sólo queda uno, pero es evidente que el orden de la lista de carpetas no se respeta.

La solución es tan sencilla como crear un contador que se incremente con cada carpeta de la lista y añadir ese contador al array de pares (ahora tríos) para que quede así... bytes#orden#archivo. Si luego ordenamos la lista en orden alfabético inverso nos quedaría así...

<b>12345</b>3<a>/CarpetaA/IMG20160225-0099.jpg</a>
<b>12345</b>2<a>/CarpetaC/IMG20160225-0041.jpg</a>
<b>12345</b>1<a>/CarpetaB/IMG20160225-0103.jpg</a>

Y si aplicamos el mecanismo de comparación/eliminación descrito antes nos quedará de nuevo el tercer archivo, pero que esta vez sí es el de la primera carpeta puesta en la lista.

Tema resuelto ... ¿seguro?

Pues no. Eso funciona hasta 9 carpetas, pero si llegamos a 10 el invento falla de forma escandalosa porque al ordenar alfabéticamente la secuencia 1,2,3,4,5,6,7,8,9,10 queda así ... 1,10,2,3,4,5,6,7,8,9 ... una cagada.

La solución (hasta que aparezca una nueva cagada) es iniciar ese contador de tal forma que a la primera carpeta se le asigne un 10 en vez de un 1. Eso garantiza un ordenamiento correcto hasta llegar al valor 99 lo que permite procesar 90 carpetas, que no creo que suceda jamás.

Si a nadie se le ocurre por dónde puede fallar todo esto mañana pongo la tarea definitiva con todo esto implementado.

Buenas noches
__________________
Miembro del equipo que promueve el [Subforo de Tasker]

Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino)
Responder Con Cita
Gracias de parte de:
  #56  
Viejo 25/02/16, 23:30:18
Array

[xs_avatar]
Caravantes Caravantes no está en línea
Usuario muy activo
· Votos compra/venta: (1)
 
Fecha de registro: feb 2011
Mensajes: 2,200
Modelo de smartphone: Samsung Galaxy S9
Tu operador: Lowi
 Cita: Originalmente Escrito por WillyWeb Ver Mensaje
Eso funciona hasta 9 carpetas, pero si llegamos a 10 el invento falla de forma escandalosa porque al ordenar alfabéticamente la secuencia 1,2,3,4,5,6,7,8,9,10 queda así ... 1,10,2,3,4,5,6,7,8,9 ... una cagada.
La solución (hasta que aparezca una nueva cagada) es iniciar ese contador de tal forma que a la primera carpeta se le asigne un 10 en vez de un 1. Eso garantiza un ordenamiento correcto hasta llegar al valor 99 lo que permite procesar 90 carpetas, que no creo que suceda jamás.
Yo también creo que esa es la solución más fácil y eficiente, dada la situación en la que estamos (que no merece la pena contemplar más de 90 carpetas simultáneas). Se parece bastante a lo que yo había pensado, pero tú lo has implementado mejor. Excelente.
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
Responder Con Cita
Los siguientes 2 usuarios han agradecido a Caravantes su comentario:
  #57  
Viejo 26/02/16, 00:06:56
Array

[xs_avatar]
Mx WaR HaBiB Mx WaR HaBiB no está en línea
Usuario muy activo
 
Fecha de registro: mar 2014
Localización: Dream Planet
Mensajes: 875
Modelo de smartphone: Galaxy Note 3
Tu operador: Movistar
 Cita: Originalmente Escrito por leromaro Ver Mensaje
Excelente tarea han creado!!!! He seguido el hilo día a día y realmente quedé impresionado (cómo en tantas otras ocasiones)
comparto lo dicho felicidades me quedo pasmado al ver que cosas tan meticulosas se pueden hacer y yo de empiezo...

felicidades a todos por contribuir en especial a los masters!
__________________
"Tanto si piensas que puedes, como si piensas que no puedes, estás en lo cierto"
— Henry Ford —
Responder Con Cita
Gracias de parte de:
  #58  
Viejo 26/02/16, 12:50:55
Array

[xs_avatar]
WillyWeb WillyWeb no está en línea
Usuario muy activo
 
Fecha de registro: dic 2008
Localización: Hoy aquí y mañana allí
Mensajes: 2,067
Modelo de smartphone: OnePlus 3T | Xiaomi 9T Pro
Tu operador: Vodafone
Creo que con esta versión se alcanzan todos los objetivos propuestos...
  • Se eliminan archivos duplicados con verificación binaria de que son 100% iguales.
  • Es posible procesar más de una carpeta al mismo tiempo, lo que permite hacer comparaciones entre carpetas.
  • Se tiene en cuenta el orden de las carpetas para establecer la prioridad de borrado en caso de coincidencias entre carpetas.

Y como valores añadidos...
  • Se puede usar como una subtarea (su propósito principal).
  • Devuelve el resultado del proceso realizado.
  • El tiempo de ejecución está optimizado al máximo evitando varios miles de iteraciones en las comparaciones entre archivos.
  • Está completamente escrita con acciones de Tasker (menos el comando de consola para la comparación binaria) lo que facilita su comprensión para los menos expertos.

La descripción de la tarea es la siguiente...
  • A2: Lista de carpetas a procesar separadas por comas. El orden de las carpetas determina con qué prioridad se eliminan los archivos duplicados (se conserva el de la carpeta que esté antes en la lista).
  • A3: Lista de patrones de tipo de archivo a procesar separados por barras (Ej. IMG*.jpg/*.jpeg/*.gif).
  • A4: Si %par1 y %par2 no están definidos la tarea devuelve "PARX" y termina.
  • A5: Se inicializa el contador de tiempo de ejecución.
  • A6: Se crea un array con la lista de carpetas de %par1.
  • A7: Se inicializa el contador de prioridad entre carpetas a la hora de eliminar duplicados. La tarea puede priorizar sin problemas 90 carpetas. Si alguien cree que no son suficientes sólo tiene que que cambiar el 100 por un 1000 y el límite aumenta a 900 carpetas.
  • A8: Comienza el bucle (que termina en A16) que procesar cada carpeta del array de carpetas.
  • A9: Se ajusta el contador de prioridad de carpetas para la carpeta que se está procesando.
  • A10-A15: Para cada carpeta; Se obtiene su lista de archivos (A10) y el tamaño de cada uno de ellos (A12). Esos dos datos más el valor de prioridad de la carpeta, se almacena en el array que contendrá todos los archivos a procesar (A13 y A14) con la forma: bytes#prioridad#archivo.
  • A17: Si no se han encontrado archivos la tarea devuelve "VACIO" y termina.
  • A18: Se ordena el array de archivos a procesar alfabéticamente. Cada elemento del array está formado por tres datos (bytes#prioridad#archivo). El punto clave es que después de esa ordenación los archivos con el mismo tamaño quedan consecutivos en el array y, a igualdad de tamaño, ordenados por la prioridad de su carpeta.
  • A19: Se calcula el penúltimo elemento del array.
  • A20-A21: Se inicializan los contadores de archivos y bytes eliminados.
  • A22: Comienza el bucle (que termina en A35) que procesa la lista de archivos desde el primero hasta el penúltimo buscando duplicados.
  • A23: Se determina cuál es el siguiente elemento al que se está procesando.
  • A24: Se unen los datos del elemento procesado y del siguiente.
  • A25: Se obtienen los bytes de ambos archivos con una RegExp.
  • A26: Si ambos tamaños son iguales se obtiene el nombre de cada uno de ellos con una RegExp (A27), se comparan en binario (A28) y si la comparación no encuentra diferencias (A29) se elimina el archivo de la carpeta con menos prioridad (A32) y se contabilizan los datos de la eliminación (A30 y A31).
  • A36: Se calcula el tiempo empleado por la tarea.
  • A37-A38. Se muestran/devuelven los resultados en una lista de valores separados por comas con la forma: ficheros procesados, ficheros borrados, bytes borrados, milisegundos empleados.

Y su código Tasker...

Código:
BorraDuplicados (666)
	  A1: Destino (de goto)
<La tarea elimina los posibles archivos duplicados de uno o varios directorios. Se puede usar como subtarea, poniendo en el par1 la lista de directorios separados por comas (se tiene en cuenta su orden) y en el par2 el/los tipo(s) de archivos a procesar. La tarea devuelve cuatro valores separados por comas: archivos procesados, archivos borrados, bytes borrados, milisegundos empleados> 
	  A2: Establecer variable [ Nombre:%par1 A:/sdcard/tmp2,/sdcard/tmp1 ] Si (if) [ %caller1 ~ ui ]
	  A3: Establecer variable [ Nombre:%par2 A:*.jpeg/*.jpg ] Si (if) [ %caller1 ~ ui ]
	  A4: Devolver [ Valor:PARX Detener:Encendido ] Si (if) [ %par1 No ajust. | %par2 No ajust. ]
	  A5: Establecer variable [ Nombre:%tictac A:%TIMEMS ] 
	  A6: Separar variable [ Nombre:%par1 Separador:, ] 
	  A7: Establecer variable [ Nombre:%peso A:100 ] 
	  A8: For [ Variable:%carpeta Ítems:%par1() ] 
	  A9:    Restar de variable [ Nombre:%peso Valor:1 ] 
	A10:    Listar archivos [ Directorio:%carpeta Coincidir:%par2 Variable:%lista Continuar Tarea Tras Error:Encendido ] 
	A11:    For [ Variable:%archivo Ítems:%lista() ] 
	A12:       Probar Archivo [ Tipo:Tamaño Datos:%archivo Almacenar Resultado en:%bytes Continuar Tarea Tras Error:Encendido ] 
	A13:       Sumar a variable [ Nombre:%chk Valor:1 ] 
	A14:       Establecer variable [ Nombre:%archivos(%chk) A:<b>%bytes</b>%peso<a>%archivo</a> ] 
	A15:    End For 
	A16: End For 
	A17: Devolver [ Valor:VACIO Detener:Encendido ] Si (if) [ %archivos(#) = 0 ]
	A18: Procesar Array [ Variable:%archivos Tipo:Orden Alfabético ] 
	A19: Establecer variable [ Nombre:%finchk A:%archivos(#)-1 Calcular:Encendido ] 
	A20: Establecer variable [ Nombre:%filesbor A:0 ] 
	A21: Establecer variable [ Nombre:%bytesbor A:0 ] 
	A22: For [ Variable:%chk Ítems:1:%finchk ] 
	A23:    Establecer variable [ Nombre:%sigchk A:%chk+1 Calcular:Encendido ] 
	A24:    Establecer variable [ Nombre:%archivos A:%archivos(%chk) %archivos(%sigchk) ] 
	A25:    Buscar y Reemplazar Contenido de Variable [ Variable:%archivos Buscar:(?<=<b>).*?(?=</b>) Almacenar Coincidencias En:%bytes ] 
	A26:    Si (if) [ %bytes1 = %bytes2 ]
	A27:       Buscar y Reemplazar Contenido de Variable [ Variable:%archivos Buscar:(?<=<a>).*?(?=</a>) Almacenar Coincidencias En:%file ] 
	A28:       Ejecutar consola [ Comando:cmp %file1 %file2 Almacenar Salida En:%salida Continuar Tarea Tras Error:Encendido ] 
	A29:       Si (if) [ %salida No ajust. ]
	A30:          Sumar a variable [ Nombre:%filesbor Valor:1 ] 
	A31:          Sumar a variable [ Nombre:%bytesbor Valor:%bytes1 ] 
	A32:          Eliminar archivo [ Archivo:%file1 Continuar Tarea Tras Error:Encendido ] 
	A33:       Fin si (End if) 
	A34:    Fin si (End if) 
	A35: End For 
	A36: Establecer variable [ Nombre:%tictac A:%TIMEMS-%tictac Calcular:Encendido ] 
	A37: Flash [ Texto:%archivos(#),%filesbor,%bytesbor,%tictac Largo:Encendido ] Si (if) [ %caller1 ~ ui ]
	A38: Devolver [ Valor:%archivos(#),%filesbor,%bytesbor,%tictac Detener:Encendido ]
Si alguien requiere aclaraciones adicionales será un placer responder. Lo mismo digo si alguien tiene sugerencias, encuentra errores o quiere añadir nuevas funcionalidades.

Su uso como subtarea (su propósito principal) podría ser tal que así...

Código:
LimpiaFotosDuplicadasWA (777)
	A1: Establecer variable [ Nombre:%carpeta1 A: /sdcard/WhatsApp/Media/WhatsApp Images ] 
	A2: Establecer variable [ Nombre:%carpeta2 A: /sdcard/WhatsApp/Media/WhatsApp Images/Sent ] 
	A3: Establecer variable [ Nombre:%filtro A: *.jpg/*.jpeg/*.gif ] 
	A4: Realizar tarea [ Nombre:BorraDuplicados Prioridad:%priority Parámetro 1 (%par1):%carpeta2,%carpeta1 Parámetro 2 (%par2):%filtro Devolver Valor de Variable:%resultado ] 
	A5: Flash [ Texto:%resultado Largo:Encendido ]
En este ejemplo se analizan los tipos de archivos incluidos en "%filtro" de dos carpeta al mismo tiempo y si se encuentran duplicados entre ellas se conservarán los archivos de "%carpeta2" ya que es la primera incluida en la lista de "%par1".

Para usar la tarea directamente desde el UI de Tasker...
  • Se debe dar valores correctos a %par1 (A2) y %par2 (A3).
  • Se inicia la ejecución pulsan el botón PLAY.
  • Al final aparecerá un flash con el resultado de la operación (A37).

Saludos al respetable
__________________
Miembro del equipo que promueve el [Subforo de Tasker]

Si das pescado a un hombre hambriento le nutres una jornada. Si le enseñas a pescar le nutrirás toda la vida. (Lao-Tsé - Filósofo chino)

Última edición por WillyWeb Día 16/03/16 a las 23:42:07. Razón: Aclaraciones sobre el funcionamiento de la tarea.
Responder Con Cita
Los siguientes 8 usuarios han agradecido a WillyWeb su comentario:
[ Mostrar/Ocultar listado de agradecimientos ]
  #59  
Viejo 26/02/16, 18:56:37
Array

[xs_avatar]
Caravantes Caravantes no está en línea
Usuario muy activo
· Votos compra/venta: (1)
 
Fecha de registro: feb 2011
Mensajes: 2,200
Modelo de smartphone: Samsung Galaxy S9
Tu operador: Lowi
Fantástico Willy.
Sigo asombrado por tu capacidad para exprimir al máximo las diferentes técnicas (comandos de Linux, gestion de arrays, expresiones regulares) todo lo cual produce un resultado óptimo. A mí me habría costado varias semanas preparar una tarea que hiciera la misma labor, pero mi tarea tendría más de 150 acciones (más compleja, dificil de entender y mantener) y lo peor de todo es que necesitaría 50 veces más tiempo para ejecutarse. Lo que has hecho es admirable. Felicitaciones y muchas gracias.

 Cita: Originalmente Escrito por WillyWeb Ver Mensaje
La descripción de la tarea es la siguiente...
Creo que, en ese post, justo tras esa frase convendría que añadieras unas explicaciones del tipo que pusiste en la primera tarea, algo como lo siguiente (corrige lo que quieras o haz tu propia versión):
  • A2-A7. Explicación de la tarea. Se inicializan diversas variables.
  • A8-A16. Se procesa cada carpeta en un bucle.
  • A10-A15. Para cada carpeta, se cargan los nombres de los archivos en un array y se recorre el array para obtener el tamaño de cada archivo y meter en el array los tres datos básicos de ese archivo: TamañoDelArchivo + OrdenDeLaCarpeta + RutaYNombreDelArchivo
  • A18. Ordenar todo el array alfabéticamente (recuerda que cada elemento del array está formado por tres datos, comenzando por el tamaño del archivo en bytes). El punto clave es que después de esa ordenación los archivos con el mismo tamaño quedan consecutivos en el array.
  • A19-A21. Inicializar otras variables.
  • A22-A35. Recorrer de nuevo todo el array ya ordenado, para comparar cada elemento del array con el elemento siguiente.
  • A25-A26. Obtener el tamaño de los dos archivos consecutivos y mirar si son iguales. En caso afirmativo...
  • A28-A29. Obtener el nombre completo (RutaYNombreDelArchivo) de los dos archivos consecutivos y utilizar el comando CMP (Linux) para compararlos y ver si son exactamente iguales. En caso afirmativo...
  • A30-A32 Se incremtan los contadores de ficheros borrados y de bytes borrados; se elimina el primero de los archivos comparados.
  • A36-A38. Se calculan los milisegundos empleados en la tarea y se muestran/devuelven los resultados: Ficheros procesados, ficheros borrados, bytes borrados, milisegundos empleados.

Añado otra petición o sugerencia para el compañero Albalatvs que fue quien inició el hilo:
Edita el primer post del hilo, añadiendo un comentario inicial para explicar que el asunto ha provocado un buen puñado de mensajes, pero quien tenga interés en la solución puede ir directamente al post definitivo que resuelve el problema y que está en
http://www.htcmania.com/showthread.p...6#post22207586
Además, en ese primer post, entras en edición avanzada y cambias el prefijo del título (Consulta) poniendo SOLUCIONADO. Gracias.
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
Responder Con Cita
Gracias de parte de:


  #60  
Viejo 26/02/16, 19:33:16
Array

[xs_avatar]
Mitrhandir Mitrhandir no está en línea
Usuario muy activo
 
Fecha de registro: ene 2014
Localización: Burrifornia
Mensajes: 910
Modelo de smartphone: Huawei Ascend G7
Tu operador: Yoigo
De mil amores lo hago Caravantes! Dame un momento! WillyWeb, me uno a las felicitaciones del compañero Caravantes. Si de mí dependiera, la copa virtual la tendrías ya!

Un saludo
Responder Con Cita
Gracias de parte de:
Respuesta

Estás aquí
Regresar   Portal | Indice > Todo sobre Android > Otro software para Android > Tasker



Hora actual: 17:26:32 (GMT +1)



User Alert System provided by Advanced User Tagging (Lite) - vBulletin Mods & Addons Copyright © 2026 DragonByte Technologies Ltd.

Contactar por correo / Contact by mail / 邮件联系 /