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

Respuesta
 
Herramientas
  #21  
Viejo 21/02/16, 20:58:39
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 albalatvs Ver Mensaje
Tarea:
A1: ejecutar consola
Comando: md5 /storage/sdcard1/pruebas
Almacenar resultado
A2: Ejecutar consola
Comando: rm /storage/sdcard1/pruebas/*.jpg si if %Duplicados coincide on
Vayamos por partes. Empecemos simplificando el problema a una única carpeta. O sea que -para empezar- solo vamos a comparar y procesar los archivos de una carpeta o directorio. Después de que hayamos resuelto este problema sencillo, ya extenderemos el planteamiento a distintas carpetas.

Tienes que comparar DOS archivos para saber si son iguales (si son idénticos, borras uno de ellos; si no lo son, entonces no haces nada), y luego tienes que comparar OTROS dos archivos, y así tienes que comparar (de DOS en DOS) todos los archivos. Por simplificar supongamos que la carpeta tiene solo diez archivos. Has de comparar el archivo número 1 con cada uno de los otros 9; luego has de comparar el archivo 2 con cada uno de los otros 8 restantes; luego has de comparar el archivo 3 con cada uno los otros 7 restantes, etc... hasta comparar el archivo 8 con el 9, y ahí has terminado las comparaciones. De este modo, teniendo solo 10 archivos se necesitan hacer 45 compraraciones. Ya te puedes imaginar que las cifras son proporcionalmente mayores si tienes cien archivos o más.

Como puedes entender, necesitas hacer eso mediante bucles. En realidad son dos bucles anidados. El primer bucle elige un archivo cada vez, es el primer archivo de la comparaciones (para compararlo con archivos siguientes). El segundo bucle elige el segundo archivo de la comparación.

Para cada comparación hay que averiguar si los archivos son idénticos. En caso afirmativo hay que borrar uno de los dos archivos que han sido comparados. Lo que tú has puesto

Comando: rm /storage/sdcard1/pruebas/*.jpg si if %Duplicados coincide on

Es una barbaridado porque borraría todos los archivos JPG de la carpeta en el caso de que la comparación hubiera indicado que DOS archivos son iguales.

O sea que la acción de borrar debe estar DENTRO de los dos bucles que te he indicado, y debe afectar solamente a uno de los dos archivos que han sido comparados.

El asunto es realmente muy ambicioso y complejo, no se resuelve fácilmente. Pero es totalmente posible. Otra cosa es que puede ser desproporcionado si lo queremos hacer con todos los archivos de todas las carpetas. Teniendo miles de archivos en la tarjeta SD, si los quieres comparar todos es posible que la tarea necesite días o semanas para completarse.
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
Responder Con Cita
Gracias de parte de:


  #22  
Viejo 21/02/16, 21:09:49
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
Perfil: Borrado (4)
Hora: Desde 04:00
Estado: Cargando [ Origen:Cargador ]
Entrada: Pruebas (5)
A1: Establecer variable [ Nombre:%Archivo1 A:/storage/sdcard1/prueba1.jpg Calcular:Apagado Añadir:Apagado ]
A2: Establecer variable [ Nombre:%archivo2 A: /storage/sdcard1/prueba2.jpg Calcular:Apagado Añadir:Apagado ]
A3: Establecer variable [ Nombre:%archivo3 A: /storage/sdcard1/prueba3.jpg Calcular:Apagado Añadir:Apagado ]
A4: Establecer variable [ Nombre:%Tictac A:%TIMEMS Calcular:Apagado Añadir:Apagado ]
A5: For [ Variable:%Num Ítems:1:50 ]
A6: Ejecutar consola [ Comando:md5 %Archivo1 Cuenta atrás (segundos):0 Usar Root:Encendido Almacenar Salida En:%Salida Almacenar Errores En: Almacenar Resultado en: Continuar Tarea Tras Error:Encendido ]
A7: Ejecutar consola [ Comando:cmp %archivo1 %archivo2 Cuenta atrás (segundos):0 Usar Root:Encendido Almacenar Salida En:%Salida Almacenar Errores En: Almacenar Resultado en: Continuar Tarea Tras Error:Encendido ]
A8: End For
A9: Establecer variable [ Nombre:%Tictac A:%TIMEMS-%Tictac Calcular:Encendido Añadir:Apagado ]
A10: Flash [ Texto:%Tictac Largo:Apagado ]

Aquí está, aunque A6 me da este error: 21.05.46/Variables doreplresult: |md5 %Archivo1| -> |md5 /storage/sdcard1/prueba1.jpg|
21.05.46/Variables doreplresult: |md5 %Archivo1| -> |md5 /storage/sdcard1/prueba1.jpg|
21.05.46/E Ejecutar consola: %Salida -> %Salida
21.05.46/E Ejecutar consola: ->
21.05.46/E Ejecutar consola: ->
21.05.46/Shell runBackground md5 /storage/sdcard1/prueba1.jpg root: true timeout: -1
21.05.46/Shell start process-thread ID 4162
21.05.46/E add wait type Shell2 time 2147483647
21.05.46/E add wait type Shell2 done

Voy a revisar todo. Me he tomado la libertad o licencia de poner a las variables la primera letra en mayúsculas, puesto que son variables locales nuestras. Creo que hecho bien.

Madre mía, para llegar a tu suela de tus zapatos me queda un trecho! He flipado colorines!
Responder Con Cita
  #23  
Viejo 21/02/16, 21:22:16
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
Perfil: Borrado (4)
Hora: Desde 04:00
Estado: Cargando [ Origen:Cargador ]
Espera, espera, que todavía estamos algo lejos de usar esto para algo. Sólo se trata de una prueba para calcular qué sistema de comparación nos interesa más. Nada de perfiles todavía. Sólo una tarea suelta para jugar con ella. Paciencia hombre.

 Cita: Originalmente Escrito por albalatvs Ver Mensaje
Aquí está, aunque A6 me da este error
Lo esperaba. Por eso la acción tiene puesta la marca de "Continuar Tarea Tras Erro".

 Cita: Originalmente Escrito por albalatvs Ver Mensaje
Me he tomado la libertad o licencia de poner a las variables la primera letra en mayúsculas, puesto que son variables locales nuestras.
Al poner una letra en mayúsculas las has convertido en globales (las podrás ver en la pestaña "VARIABLES") y para esto que estamos haciendo nos vale con variables locales (viven sólo mientras vive la tarea).

¿Y los tiempos de ejecución?
__________________
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
  #24  
Viejo 21/02/16, 21:44:37
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
... Otra cosa es que puede ser desproporcionado si lo queremos hacer con todos los archivos de todas las carpetas. Teniendo miles de archivos en la tarjeta SD, si los quieres comparar todos es posible que la tarea necesite días o semanas para completarse.
Pues con miles no te puedo decir, pero con un centenar no creo que tarde más de 15 segundos en el peor de los casos.

 Cita: Originalmente Escrito por Caravantes Ver Mensaje
De este modo, teniendo solo 10 archivos se necesitan hacer 45 compraraciones. Ya te puedes imaginar que las cifras son proporcionalmente mayores si tienes cien archivos o más.
Usando ese sistema (totalmente correcto por otra parte) la cantidad de iteraciones con uno cientos de archivos es mareante. Precisamente por eso tengo intención de usar "otro sistema" que sólo debería requerir una iteración.
__________________
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
  #25  
Viejo 21/02/16, 22:02:57
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
Caravantes, creo que tu planteamiento es sensato. Esto me recuerda a las permutaciones, es decir, qué probabilidades hay de que al tirar un dado salga el 5? Si el dado tiene 6 lados, para calcular esa probabilidad se ha de multiplicar 6x5x4x3x2x1 lo que arroja un resultado de 720 probabilidades de que salga cualquier número del dado.

Digo todo esto porque lo que ha comentado Caravantes me ha recordado todo esto. Quizás no venga al caso, y pero por lo menos, refrescamos memoria.

Entonces, vamos a limitarnos a archivos .jpg del WhatsApp, porque comparar todos los archivos puede llevar mucho tiempo. Y luego, veremos adónde nos llevan las conclusiones.

Entonces, sólo tendríamos que comparar las fotos de storage/sdcard1/whatsapp/media/whatsapp images/sent/*.jpg con por ejemplo, storage/sdcard1/DCIM/camera

Todo sea como bien dice Caravantes, simplificar la tarea.

Por cierto WillyWeb, la tarea me sigue dando error aún después de subsanar mi error. Vamos a frenar y a replantear la cuestión.

Saludos!
Responder Con Cita
  #26  
Viejo 21/02/16, 22:08:16
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
Por cierto WillyWeb, la tarea me sigue dando error aún después de subsanar mi error. Vamos a frenar y a replantear la cuestión.
En tu acción A7 has dejado los nombres de las variables en minúsculas. Y revisa que los archivos que estás usando están realmente en la ruta y con el nombre que les has puesto (ojo a las mayúsculas y las minúsculas).

 Cita: Originalmente Escrito por albalatvs Ver Mensaje
Entonces, vamos a limitarnos a archivos .jpg del WhatsApp, porque comparar todos los archivos puede llevar mucho tiempo.
No necesariamente.

 Cita: Originalmente Escrito por albalatvs Ver Mensaje
Entonces, sólo tendríamos que comparar las fotos de storage/sdcard1/whatsapp/media/whatsapp images/sent/*.jpg con por ejemplo, storage/sdcard1/DCIM/camera
No. Se trata de seleccionar una carpeta (la de WhastApp o la que quieras) y ver si contiene fotos duplicadas. No se trata de comparar dos carpetas. Ese es otro problema diferente.

 Cita: Originalmente Escrito por albalatvs Ver Mensaje
Todo sea como bien dice Caravantes, simplificar la tarea.
Caravantes es un optimista nato.
__________________
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 21/02/16 a las 22:12:38.
Responder Con Cita
  #27  
Viejo 21/02/16, 22:19:38
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 albalatvs Ver Mensaje
Entonces, sólo tendríamos que comparar las fotos de storage/sdcard1/whatsapp/media/whatsapp images/sent/*.jpg con por ejemplo, storage/sdcard1/DCIM/camera
Creo que no va a funcionar. Whatsapp le hace un tratamiento especial a las imágenes, aumentando su compresión y reduciendo su resolución, todo ello para disminuir el número de bytes de la imagen y así poder transmitirla de forma más rápida. Haz una foto con la cámara y luego la envías por Whatsapp, verás que el archivo de Whatsapp es mucho más pequeño que el archivo ubicado en /DCIM/camera. Comparando por tamaño y/o por contenido no van a coincidir, aunque visualmente sigan pareciendo la misma imagen.
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
Responder Con Cita
  #28  
Viejo 21/02/16, 23:20:46
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 albalatvs Ver Mensaje
Esto me recuerda a las permutaciones
Vas orientado, pero en realidad no son permutaciones sino combinaciones. Son combinaciones de m elementos tomados de n en n. En nuestro caso, la primera cifra (m) es el número total de archivos, y la segunda cifra (n) es un 2 porque los combinamos de dos en dos (cada vez comparamos DOS archivos, el uno con respecto al otro).

Por ejemplo, para 1000 archivos, la fórmula es C(1000,2) y el resultado es 499500.

O sea que son casi medio millón de combinaciones, que en nuestro caso representan casi medio millón de comparaciones sucesivas para averiguar si en entre esos mil archivos hay algunos repetidos.

En la siguiente URL hay una calculadora de combinaciones para poner cualquier cifra y obtener el resultado de forma inmediata.
http://www.estadisticaparatodos.es/s...atorio2.html#7
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
Responder Con Cita
  #29  
Viejo 21/02/16, 23:29:35
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 todas formas, yo tengo un cacao mental impresionante, pero por lo menos, vamos dilucidando cosas. No había caído en lo que comentas, que no es la misma compresión de una foto hecha con la cámara que una mandada por WhatsApp. Es una excelente observación por tu parte. WillyWeb se lo está pasando pipa con este desafío.
Responder Con Cita
  #30  
Viejo 22/02/16, 08:26:50
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
Por ejemplo, para 1000 archivos, la fórmula es C(1000,2) y el resultado es 499500.

O sea que son casi medio millón de combinaciones, que en nuestro caso representan casi medio millón de comparaciones sucesivas para averiguar si en entre esos mil archivos hay algunos repetidos.
Si lo haces comparando cada archivo con cada uno con el que no se haya comparado previamente esas son las cuentas, pero eso se puede "minimizar" usando un poco de ingenio y dejarlo en 999 comparaciones como máximo.
__________________
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
  #31  
Viejo 22/02/16, 08:29:40
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
...Haz una foto con la cámara y luego la envías por Whatsapp, verás que el archivo de Whatsapp es mucho más pequeño que el archivo ubicado en /DCIM/camera. Comparando por tamaño y/o por contenido no van a coincidir, aunque visualmente sigan pareciendo la misma imagen.
Pero es que no es ese el planteamiento inicial. Se trataba de ver si en la carpeta de "enviados" (o en "recibidos") de WhatsApp existe fotos duplicadas.
__________________
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
  #32  
Viejo 22/02/16, 13:04:32
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 tenía todo en la cabeza y por fin he sacado un rato para escribirlo en Tasker.

Me falta por añadir la verificación en binario (todavía no me habéis dicho qué sistema pensáis que es más rápido, cmp o md5) pero el resto ya es totalmente funcional. Lo he probado en dos carpeta de mi WhastApp con "posibles" duplicados y han cantado por peteneras.

Carpeta de imágenes recibidas
3700 archivos
80 posibles duplicados
79300 milisegundos (unos 80 segundos)

Carpeta de imágenes enviadas
500 archivos
19 posibles duplicados
10500 milisegundos (unos 11 segundos)

Tal y como ha explicado Caravantes, comparar cada archivo con el resto requiere una burrada de iteraciones. Exactamante...

C(500,2)=124750 para la carpeta de 500 archivos
C(3700,2)=6843150 para la carpeta de 3700 archivos

Un bucle de 10000 iteraciones de Tasker, limpio, sin nada dentro, sólo el For y el EndFor me lleva unos 19 segundos, así que uno de 124750 iteraciones (el de los 500 archivos) me llevaría mucho más de 200 segundos. Y eso sólo para pasar por todas las combinaciones posibles, sin hacer nada más. Con mi sistema he detectado los 19 posibles duplicados en 11 segundos.

Esto marcha
__________________
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 22/02/16 a las 13:22:19.
Responder Con Cita
  #33  
Viejo 22/02/16, 20:02:45
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
Si lo haces comparando cada archivo con cada uno con el que no se haya comparado previamente esas son las cuentas, pero eso se puede "minimizar" usando un poco de ingenio y dejarlo en 999 comparaciones como máximo.
Felicitaciones por ese avance, y mi más profunda admiración. Estoy deseando que expliques ese truco. Tiene muy buena pinta pero yo ni siquiera atisbo qué clase de algoritmo puedes estar usando para reducir la combinatoria de forma tan eficiente. Porfa, porfa.

 Cita: Originalmente Escrito por WillyWeb Ver Mensaje
Se trataba de ver si en la carpeta de "enviados" (o en "recibidos") de WhatsApp existe fotos duplicadas.
Fue Alba el que propuso comparar los archivos de Whatsapp con los de la cámara (DCIM/camera) y a eso respondí que nunca van a ser iguales. El planteamiento inicial de Alba era muy difuso, y poco a poco lo vamos concretando, aunque algunas veces sea con propuestas como esa, una idea "brainstorm" que en este caso concreto no resulta aprovechable.

Puesto que todavía estamos en la fase inicial del asunto, repito que me conformaría con empezar comparando los archivos de una sola carpeta. Para empezar eligiendo alguna en concreto, me parece muy oportuno usar cualquiera de las que tú has probado (WhatsApp/Media/Whatsapp Images o bien WhatsApp/Media/Whatsapp Images/Sent). Luego, quizá podamos extender el planteamiento para hacer la comparación entre cualesquiera pareja de archivos de dos carpetas (esas dos, u otras), o quizá incluso más de dos.

Parece que tú, Willy, ya tienes bastante orientada la primera fase del asunto, así pues... cuando quieras nos muestras tu tarea, estamos deseando verla. Gracias.
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
Responder Con Cita
  #34  
Viejo 22/02/16, 21:43:16
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
Pido disculpas. Esta mañana me "obligaron" a dejar el post justo cuando me disponía a explicar el "truco" que he utilizado. He intentado retomarlo esta tarde, pero no me dejan tranquilo (maldito teléfono). Cuando finalmente me he puesto al tema me ha llegado el aviso de un nuevo post (el tuyo Caravantes) y me he parado en seco para ver de qué se trataba (la verdad es que esperaba una bronca).

 Cita: Originalmente Escrito por Caravantes Ver Mensaje
Estoy deseando que expliques ese truco.
En línea generales consiste en lo siguiente:
  • Cargas los nombre de los archivos en un array
  • Recorres todo el array para conseguir el tamaño de cada archivo
  • Pones el tamaño del archivo por delante de su nombre de forma que en cada elemento del array quede bytes#nombre
  • Ordenas el array alfabéticamente (recuerda que cada elemento del array está formado por la pareja bytes#nombre)
  • Después de esa ordenación los archivos con el mismo tamaño quedan consecutivos en el array (este es el punto clave)
  • Recorres de nuevo el array ordenado separando la pareja bytes#nombre de cada elemento y del siguiente
  • Si los "bytes" de esos dos elementos son iguales tienes un 99.99% de que se trate de un archivo duplicado
  • Ya se podría eliminar uno de ellos, pero para confirmar haces una comparación binaria (por cmp o md5) y si son iguales borras el "nombre" de uno de ellos (mejor el primero)

En una pasada se detectan y eliminan los archivos duplicados. Si la lista tiene 1000 archivos son necesarias 999 comparaciones en vez de 499500.

 Cita: Originalmente Escrito por Caravantes Ver Mensaje
Puesto que todavía estamos en la fase inicial del asunto, repito que me conformaría con empezar comparando los archivos de una sola carpeta. Para empezar eligiendo alguna en concreto, me parece muy oportuno usar cualquiera de las que tú has probado (WhatsApp/Media/Whatsapp Images o bien WhatsApp/Media/Whatsapp Images/Sent). Luego, quizá podamos extender el planteamiento para hacer la comparación entre cualesquiera pareja de archivos de dos carpetas (esas dos, u otras), o quizá incluso más de dos.
Estaba pensando en modificar la tarea para generar la lista de archivos desde la consola, lo que es mucho más flexible que la acción de Tasker (que sólo acepta una carpeta), pero antes de hacer eso se me ha ocurrido que podía convertir la tarea que ya tengo hecha en una subtarea que acepte dos parámetros, la carpeta y el filtro de archivos. De esa forma se podría usar para procesar la carpeta y tipo de archivo que nos interese. ¿Cómo lo veis?

 Cita: Originalmente Escrito por Caravantes Ver Mensaje
Parece que tú, Willy, ya tienes bastante orientada la primera fase del asunto, así pues... cuando quieras nos muestras tu tarea, estamos deseando verla. Gracias.
Pues en lo que haga los cambios a subtarea y verifique qué sistema de comparación binaria es más efectivo la pongo a vuestra disposición.
__________________
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:
  #35  
Viejo 22/02/16, 23:33:25
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
Hola! Lo siento, hoy he tenido un día completo y ahora he podido relajarme un poco.

Yo lo estoy flipando.
Responder Con Cita
  #36  
Viejo 23/02/16, 03:43:21
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
Cargas los nombre de los archivos en un array
Recorres todo el array para conseguir el tamaño de cada archivo
Pones el tamaño del archivo por delante de su nombre de forma que en cada elemento del array quede bytes#nombre
Ordenas el array alfabéticamente (recuerda que cada elemento del array está formado por la pareja bytes#nombre)
Estás haciendo una pequeña trampa, al menos en lo conceptual. La ordenación ya implica comparar cada elemento del array (bytes#nombre) con todos los demás elementos del array. O sea que, si tienes 1000 archivos, la ordenación ya implica realizar 499500 comparaciones.

A pesar de ello, veo probable que este truco acabe siendo muy ventajoso. La idea es muy ingeniosa y se puede buscar la mejor forma de explotarla bien para optimizar el rendimiento.

Esto me recuerda algo reciente. Hace unos días, el compañero Cace0353 tenía una tarea Tasker que se demoraba demasiado (12 segundos) , pero luego pasó parte de las acciones a javascript y con eso consiguió reducir el tiempo de ejecución a la tercera parte (4 segundos).
http://www.htcmania.com/showthread.php?t=631165&page=2

Creo que aquí estamos en un caso parecido. En realidad no creo que podamos evitar las 499500 comparaciones, pero tal vez podamos hacer la mayor parte del trabajo mediante atajos que mejoren la eficiencia.

Por ejemplo, podemos (A) ordenar el array mediante un bucle de Tasker que compare cada pareja de elementos y los intercambie de posición si procede. Otra posibilidad es (B) grabar todo el array en un archivo de texto, de forma que cada elemento del array sería una línea del archivo; luego pedirle al sistema operativo que ordene el archivo (en lo que aparentemente sería una sola acción Sort, aunque en realidad Linux haga medio millón de comparaciones), y terminamos leyendo el archivo para cargar otra vez el array con la ordenación ya hecha. Sospecho que la opción B es mucho más eficiente que la A.

 Cita: Originalmente Escrito por WillyWeb Ver Mensaje
Cuando finalmente me he puesto al tema me ha llegado el aviso de un nuevo post (el tuyo Caravantes) y me he parado en seco para ver de qué se trataba (la verdad es que esperaba una bronca).
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
Responder Con Cita
  #37  
Viejo 23/02/16, 10:16:01
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
Estás haciendo una pequeña trampa, al menos en lo conceptual. La ordenación ya implica comparar cada elemento del array (bytes#nombre) con todos los demás elementos del array. O sea que, si tienes 1000 archivos, la ordenación ya implica realizar 499500 comparaciones.
No siempre una ordenación necesita tantas comparaciones. El sistema que describes es el menos eficiente (sistema de intercambio). Existen otros sistema mucho más eficientes y relativamente sencillos de implementar, como estos tres: BubbleSort, CocktailSort o QuickSort.

 Cita: Originalmente Escrito por Caravantes Ver Mensaje
Esto me recuerda algo reciente. Hace unos días, el compañero Cace0353 tenía una tarea Tasker que se demoraba demasiado (12 segundos), pero luego pasó parte de las acciones a javascript y con eso consiguió reducir el tiempo de ejecución a la tercera parte (4 segundos).
Ya he pensado en ello. Tengo pendiente hacer una prueba para ver si merece la pena.

 Cita: Originalmente Escrito por Caravantes Ver Mensaje
Por ejemplo, podemos (A) ordenar el array mediante un bucle de Tasker que compare cada pareja de elementos y los intercambie de posición si procede. Otra posibilidad es (B) grabar todo el array en un archivo de texto, de forma que cada elemento del array sería una línea del archivo; luego pedirle al sistema operativo que ordene el archivo (en lo que aparentemente sería una sola acción Sort, aunque en realidad Linux haga medio millón de comparaciones), y terminamos leyendo el archivo para cargar otra vez el array con la ordenación ya hecha. Sospecho que la opción B es mucho más eficiente que la A.
No necesitas nada de eso. Tasker ya tiene una acción para ordenar un array que es muy eficiente (Procesar Array). En el caso de los 3700 pares bytes#nombre tarda un par de segundo en mi dispositivo. Puede que la función de ordenación de JavaScript sea un poco más rápida, pero el traspaso de variables Tasker<>JavaScript también lleva un tiempo que se debe tener en cuenta. Lo que dudo mucho es que un script en Bash tarde menos que la acción de Tasker.

Esta tarea se puede optimizar (todavía más), pero no en la ordenación del array. El bucle que obtiene los tamaños de archivo y el que después compara los elementos consecutivos son objetivos mucho más interesantes ... estoy en ello.
__________________
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:
  #38  
Viejo 23/02/16, 21:46:31
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
Aquí os dejo la tarea que elimina archivos duplicados de cualquier carpeta y de cualquier tipo (siempre que la carpeta no requiera permisos especiales)...

Código:
BorraDuplicados (666)
	  A1: Establecer variable [ Nombre:%par1 A:/sdcard/tmp ] 
	  A2: Establecer variable [ Nombre:%par2 A:*.jpg/*.jpeg ] 
	  A3: Devolver [ Valor:PARX Detener:Encendido ] Si (if) [ %par1 No ajust. | %par2 No ajust. ]
	  A4: Establecer variable [ Nombre:%tictac A:%TIMEMS ] 
	  A5: Listar archivos [ Directorio:%par1 Coincidir:%par2 Variable:%archivos Continuar Tarea Tras Error:Encendido ] 
	  A6: Establecer variable [ Nombre:%finchk A:%archivos(#) ] 
	  A7: Devolver [ Valor:VACIO Detener:Encendido ] Si (if) [ %finchk = 0 ]
	  A8: For [ Variable:%chk Ítems:1:%finchk ] 
	  A9:   Probar Archivo [ Tipo:Tamaño Datos:%archivos(%chk) Almacenar Resultado en:%bytes Usar Root:Apagado Continuar Tarea Tras Error:Encendido ] 
	A10:   Establecer variable [ Nombre:%archivos(%chk) A:<b>%bytes</b><a>%archivos(%chk)</a> Calcular:Apagado Añadir:Apagado ] 
	A11: End For 
	A12: Procesar Array [ Variable:%archivos Tipo:Orden Alfabético ] 
	A13: Establecer variable [ Nombre:%filesbor A:0 ] 
	A14: Establecer variable [ Nombre:%bytesbor A:0 ] 
	A15: Restar de variable [ Nombre:%finchk Valor:1 ] 
	A16: For [ Variable:%chk Ítems:1:%finchk ] 
	A17:    Establecer variable [ Nombre:%sigchk A:%chk+1 Calcular:Encendido ] 
	A18:    Establecer variable [ Nombre:%archivos A:%archivos(%chk) %archivos(%sigchk) ] 
	A19:    Buscar y Reemplazar Contenido de Variable [ Variable:%archivos Buscar:(?<=<b>).*?(?=</b>) Almacenar Coincidencias En:%bytes ] 
	A20:    Si (if) [ %bytes1 = %bytes2 ]
	A21:       Buscar y Reemplazar Contenido de Variable [ Variable:%archivos Buscar:(?<=<a>).*?(?=</a>) Almacenar Coincidencias En:%file ] 
	A22:       Ejecutar consola [ Comando:cmp %file1 %file2 Almacenar Salida En:%salida Continuar Tarea Tras Error:Encendido ] 
	A23:       Si (if) [ %salida No ajust. ]
	A24:          Sumar a variable [ Nombre:%filesbor Valor:1 ] 
	A25:          Sumar a variable [ Nombre:%bytesbor Valor:%bytes1 ] 
	A26:          Eliminar archivo [ Archivo:%file1 Continuar Tarea Tras Error:Encendido ] 
	A27:       Fin si (End if) 
	A28:    Fin si (End if) 
	A29: End For 
	A30: Establecer variable [ Nombre:%tictac A:%TIMEMS-%tictac Calcular:Encendido ] 
	A31: Flash [ Texto:%archivos(#),%filesbor,%bytesbor,%tictac Largo:Encendido ] 
	A32: Devolver [ Valor:%archivos(#),%filesbor,%bytesbor,%tictac Detener:Encendido ]
Como ya os había comentado el funcionamiento de la tarea es el siguiente...
  • Cargas los nombre de los archivos en un array (A5)
  • Recorres todo el array para conseguir el tamaño de cada archivo (A8-A11)
  • Pones el tamaño del archivo por delante de su nombre de forma que en cada elemento del array quede bytes#archivo (A10)
  • Ordenas el array alfabéticamente (recuerda que cada elemento del array está formado por la pareja bytes#archivo) (A12)
  • Después de esa ordenación los archivos con el mismo tamaño quedan consecutivos en el array (este es el punto clave)
  • Recorres de nuevo el array ordenado (A16-A29) separando la pareja bytes#archivo de cada elemento y del siguiente (A17-A19)
  • Si los "bytes" de esos dos elementos son iguales tienes un 99.99% de que se trate de un archivo duplicado (A20-A28)
  • Ya se podría eliminar uno de ellos, pero para confirmar haces una comparación binaria (A22) y si son iguales borras el primer "archivo" (A23-A27)

Lo de la pareja bytes#archivo al final ha quedado como <b>bytes</b><a>archivo</a>. Eso me ha permitido usar una RegExp en A19 y A21 que me saca los bytes y los nombres de archivo a comparar en dos parejas de variables (bytes1/bytes2 y file1/file2) de una tacada.

El resto de acciones no creo que requieran muchas aclaraciones, pero si algo no se entiende aquí estoy.

...

Tal como está se puede usar directamente en el UI de Tasker, aunque está pensada para ser usada como una subtarea a la que se pueda llamar con "Realizar tarea".

Como supongo que os pondréis a probar os cuento lo que tenéis que hacer y lo que debería suceder...
  • En A1 ponéis la carpeta (recomiendo rutas absoluta para asegurar el objetivo).
  • En A2 ponéis el patrón de archivo que queréis procesar (*.jpg, *.avi, IMG*.jpeg ...). Se pueden poner varios separados por barras (Tasker lo permite en este caso).
  • Le dais al PLAY y al final saldrá un flash con cuatro valores: archivos procesados, archivos borrados, bytes borrados, milisegundos empleados.

Si la usáis como subtarea...
  • Comentar/eliminar las acciones A1/A2/A31 para que haga caso de los parámetros de la llamada y que no salga el flash final.
  • Si no se pasan ambos parámetros la subtarea devuelve "PARX".
  • Si la ruta no existe o no se encuentran archivos que cumplan el patrón la subtarea devuelve "VACIO".
  • Al finalizar la tarea devuelve cuatro valores separados por comas: archivos procesados, archivos borrados, bytes borrados, milisegundos empleados.
  • Si os sobran los datos que devuelve la subtarea eliminar las acciones A13/A14/A24/A25 y cambiar el valor de A32 por "OK" o lo que os parezca.

Por si alguien tiene dudas de cómo hacer la llamada a la subtarea...

Código:
Prueba777 (777)
	A1: Realizar tarea [ Nombre:BorraDuplicados Prioridad:%priority Parámetro 1 (%par1):/sdcard/tmp Parámetro 2 (%par2):*.jpg/*.jpeg Devolver Valor de Variable:%resultado ] 
	A2: Flash [ Texto:%resultado Largo:Apagado ]
__________________
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 ]
  #39  
Viejo 23/02/16, 23:56:01
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
Aquí os dejo la tarea que elimina archivos duplicados de cualquier carpeta y de cualquier tipo
Fantástico, Willy.

Sigo fascinado por la brillante idea de concatenar el tamaño y el nombre de cada archivo. Pero además, también estoy fascinado por el dominio de las distintas técnicas (arrays, expresiones regulares, etc) que son las que hacen que la tarea llegue a los niveles de la excelencia, tanto en planteamiento como en eficiencia (velocidad de ejecución). Chapó.

Se me ocurren tres pequeñas mejoras.
- Introducir al comienzo un comentario que explique lo que hace la tarea.
- Meter una condición para distinguir cuándo funciona como subtarea (con parámetros recibidos) y cuándo funciona directamente (sin parámetros recibidos), sin necesidad de cambiar la tarea.
- Introducir una variable %subtarea que puede tener valores 0/1 dependiendo de que funcione de un modo u otro. Esa variable podría utilizarse para presentar los resultados de la forma adecuada: si es una subtarea, se devuelve una variable a la tarea principal; si no funciona como subtarea, se muestran los resultados en un flash.

Código:
A1: Destino (de goto)
<Esta tarea elimina los posibles archivos duplicados de un directorio. Se puede usar como subtarea, poniendo en el parametro1 el directorio, y en el parametro2 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: Si (if) [ %par1 ~ %* ]
A3: Establecer variable [ Nombre:%par1 A:/sdcard/tmp ] 
A4: Establecer variable [ Nombre:%par2 A:*.jpg/*.jpeg ] Añadir:Apagado ]
A5: Establecer variable [ Nombre:%subtarea A:0 Calcular:Apagado Añadir:Apagado ]
A6: Else
A7: Establecer variable [ Nombre:%subtarea A:1 Calcular:Apagado Añadir:Apagado ]
A8: Fin si (End if)
Tras eso ya se podría añadir el resto de lo que tú has preparado (a partir de tu acción A3).

Y la tarea terminaría así...

Código:
A37: Si (if) [ %subtarea = 1 ]
A38:   Flash [ Texto:%archivos(#),%filesbor,%bytesbor,%tictac Largo:Encendido ] 
A39: Else
A40:   Devolver [ Valor:%archivos(#),%filesbor,%bytesbor,%tictac Detener:Encendido ]
A41: Fin si (End if)
__________________
Firmado: Caravantes, miembro del equipo que promueve el Subforo de Tasker
Responder Con Cita
Gracias de parte de:


  #40  
Viejo 24/02/16, 08:45:51
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
- Meter una condición para distinguir cuándo funciona como subtarea (con parámetros recibidos) y cuándo funciona directamente (sin parámetros recibidos), sin necesidad de cambiar la tarea.
- Introducir una variable %subtarea que puede tener valores 0/1 dependiendo de que funcione de un modo u otro. Esa variable podría utilizarse para presentar los resultados de la forma adecuada: si es una subtarea, se devuelve una variable a la tarea principal; si no funciona como subtarea, se muestran los resultados en un flash.
Si te refieres a que la tarea sepa cuándo la usas directamente en el UI (durante la depuración) o cuándo la llamas como subtarea, la cosa es sencilla. Y no es necesario definir una variable adicional para hacerlo.

Código:
A1: Destino (de goto)
<Esta tarea elimina los posibles archivos duplicados de un directorio. Se puede usar como subtarea, poniendo en el parametro1 el directorio, y en el parametro2 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/tmp ] Si (if) [ %caller1 ~ ui ]
A3: Establecer variable [ Nombre:%par2 A:*.jpg/*.jpeg ] Si (if) [ %caller1 ~ ui ]

Y terminaría así...

A37: Flash [ Texto:%archivos(#),%filesbor,%bytesbor,%tictac Largo:Encendido ] Si (if) [ %caller1 ~ ui ]
A38: Devolver [ Valor:%archivos(#),%filesbor,%bytesbor,%tictac Detener:Encendido ]
La verdad es que lo he tenido puesto mientras escribía la tarea y lo he quitado para publicarla.

Si te refieres a usar la tarea directamente (para procesar una carpeta fija) la cosa tampoco es complicada. Sería cambiar los "Devolver" de A3/A7 por "Detener" y eliminar el "Devolver" de A32. Pero entonces la tarea perdería su gracia.

...

Ahora estoy buscando la manera de mejorar el tiempo de ejecución metiendo mano a esos dos bucles que os había comentado. De momento creo que desde la consola puedo conseguir la lista de parejas bytes#archivo ya ordenada, y además de varias carpetas al mismo tiempo. Eso permitiría comparar carpetas (donde eso tenga sentido, naturalmente).
__________________
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 24/02/16 a las 10:03:08. Razón: Aclarar el último párrafo
Responder Con Cita
Gracias de parte de:
Respuesta

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



Hora actual: 09:48:04 (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 / 邮件联系 /