Ver la Versión Completa : [ SOLUCIONADO ] Cómo borrar fotos duplicadas (Consulta)
Mitrhandir
20/02/16, 19:26:50
Hola Amigos Taskerianos!
Aquí ando tratando de crear un perfil para borrar fotos duplicadas. La idea nace de este tuto: http://www.htcmania.com/showthread.php?p=9377579
Pues nada, más o menos, es fácil. Ejecutar consola/comando: rm/storage/sdcard1/GBWhatsapp/Media/GBWhatsapp Images/Sent/*.jpg (sí, soy usuario de GBWhatsapp :risitas:)
El caso es que este comando me da error todo el rato. Al final me quedo con la mosca atrás y pruebo a ejecutar el mismo comando pero acabado en .nomedia para hacer "visibles" los archivos .jpg para luego ¡zas! ejecutar el comando rm/storage/sdcard1/GBWhatsapp/Media/GBWhatsapp Images/Sent/*.jpg
Pero nada, ni a tiros! Entonces, he pensado que para qué limitarme a una carpeta, si lo puedo hacer de forma global....
Así que como juntamos programación y variables, esto se pone divertido!
Una caña de pescar, plis? Estoy muy muy perdido y ni siquiera sé por dónde empezar! :loco:
SOLUCIONADO: La solucion aquí:
http://www.htcmania.com/showthread.php?p=22207586#post22207586
:aplausos:
Mitrhandir
20/02/16, 19:46:00
Voy a exponer lo que he hecho:
He establecido una variable %Duplicados A ON y que te calcule tanto en el perfil de pantalla apagada como encendida.
Luego he creado un perfil nuevo en el que he puesto condición valor de variable %Duplicados coincide ON y la tarea es lo que me tira para atrás: ejecutar consola- rm/storage/sdcard1/*jpg si if %Duplicados coincide on
Más o menos está todo apuntalado, pero me faltan las pinceladas maestras!
Cómo lo véis?
WillyWeb
20/02/16, 20:33:47
Pues nada, más o menos, es fácil. Ejecutar consola/comando: rm/storage/sdcard1/GBWhatsapp/Media/GBWhatsapp Images/Sent/*.jpg
Pues si el comando lo estás escribiendo tal y como lo has puesto el problema que veo es que te falta un espacio entre "rm" y la barra "/" :rolleyes:
Supongo que eres consciente de que ese comando borra sin contemplaciones todos los archivos jpg de la carpeta indicada sin tener en cuenta si son duplicados o no, que es la esencia de tu planteamiento. :oh:
¿Eso te vale o realmente quieres crear una tarea para eliminar las fotos duplicadas?
Mitrhandir
20/02/16, 20:43:49
Realmente, quiero y deseo hacer un perfil para borrar fotos duplicadas. Como habrás visto, he creado los perfiles, pero está todo cogido con pinzas... He establecido variable %Duplicados y más o menos he hecho lo mismo que me habéis enseñado. Lo que ocurre es que no me atrevo con la tarea por si borro las fotos (el backup está hecho, porsiaca). Me falta la pieza del puzzle que indique que sólo borre las fotos duplicadas.
Edito: He probado rm /storage/sdcard1/GBWhatsapp/Media/GBWhatsapp Images/Sent/*.jpg
Pero tampoco funciona... Incluso he copiado la ruta desde ES File Explorer para evitar errores. He probado de muchas maneras, pero nada!
Un saludo!
WillyWeb
20/02/16, 20:44:16
Entiendo que descartas utilizar aplicaciones específicas para estos menesteres...
https://play.google.com/store/apps/details?id=vAlmaraz.miniApp.WCleaner
https://play.google.com/store/apps/details?id=br.com.tattobr.android.wcleaner
No lo he comentado antes porque supongo que te lo quieres currar por tus medios. :silbando:
WillyWeb
20/02/16, 20:51:14
Realmente, quiero y deseo hacer un perfil para borrar fotos duplicadas...
Me lo temía :risitas:
De momento olvida los perfiles y las variables. Antes tienes que pensar en otra cosa. ¿Cómo puede saber tu tarea de Tasker que una foto es duplicada? :oh:
Recuerda que la tarea, como cualquier programa en realidad, no puede ver la foto como tú lo haces. ¿En qué se tiene que fijar la tarea para determinar que "esa" foto que está analizando ya existe? :palomitas:
Me parece que ya se hizo un proyecto parecido. De hecho estoy casi seguro que se hizo por lo menos para whatsapp. No se si estara en el recopilatorio. A ver si alguien se acuerda.
Enviado desde mi T1-701u mediante Tapatalk
Mitrhandir
20/02/16, 21:52:14
Hola Mr. Mlesir! Sí, tu memoria no falla: el tuto del que haces mención está arriba. :silbando:
Ha sido la inspiración para abrir este tema! ;-)
Te mando saludos!
Mitrhandir
20/02/16, 22:00:01
:sisi1:
No, no tengo ni idea y eso que he buscado y buscado. Incluso estoy tratando de hacer un recopilatorio de comandos para tenerlo a mano, y pero me va a costar!
Este perfil lo tengo en mente, pero has acertado de pleno con tu pregunta. Uf. Ilumíname! :palomitas:
WillyWeb
20/02/16, 22:34:43
Este perfil lo tengo en mente, pero has acertado de pleno con tu pregunta. Uf. Ilumíname!
La forma en que un programa "ve" si dos archivos (fotos o lo que sea) son iguales es comparando sus contenidos byte a byte.
Puesto que la idea inicial era usar comandos de consola sigamos por esa vía...
El comando de consola de Android que hace esa comparación binaria es "cmp" (https://es.wikipedia.org/wiki/Cmp) pero le veo una pega importante. Repetir ese proceso con un centenar de fotos me temo que se fundiría la batería en un plis-plas.
Otra opción es calcular el hash MD5 (https://es.wikipedia.org/wiki/MD5) de cada archivo. Dos archivos idénticos tendrán idénticos hash. El comando de consola de Android es "md5". Seguramente es menos costoso en términos de proceso, y se podría optimizar guardando los MD5 en un archivo y evitando calcular los hash que ya estén calculados. Localizando los MD5 iguales tendrás localizados los archivos duplicados.
Si quieres hacer experimentos con esos dos comandos puedes usar este emulador de terminal...
https://play.google.com/store/apps/details?id=jackpal.androidterm
Esos dos sistemas son precisos al 100% a costa de consumir mucha máquina. Se podría hacer una aproximación mucho menos costosa en máquina, y mucho menos precisa, comprando los tamaños de los archivos y tomando por buena la afirmación de "dos fotos con el mismo tamaño de archivo tienen que ser de la misma foto".
Dale vueltas y me cuentas :silbando:
Mitrhandir
21/02/16, 00:06:31
Ummm.... El tema de los duplicados lo puedo solventar fácilmente por ejemplo con SdMaid Pro, que, dicho sea de paso, es de mis aplicaciones de cabecera. Ocurre que yo, mente inquieta donde las hayan, siempre ando buscando tres pies al gato. No soy muy amigo de tener tropecientas mil aplicaciones: soy muy sobrio y prefiero tenerlo todo centralizado en una, que es Tasker. Incluso estoy valorando seriamente convertirla en app de sistema, porque para mí,y corregidme si exagero, es el segundo SO incluido en nuestros smartphones.
Me queda mucho recorrido y muchas ideas en el tintero para ir dando forma dentro de esta grandísima aplicación.
Un saludo! :cucu:
Caravantes
21/02/16, 00:52:09
Hola, Albalatvs.
Me da la impresión de que estás dando palos de ciego, que quizá no sabes muy bien lo que quieres hacer.
Yo no suelo tener fotos duplicadas en mi smartphone. Alguna vez puede que tenga alguna duplicada, pero no me parece un problema relevante para pensar en hacer una tarea Tasker que lo resuelva. De todas formas, como taskero vocacional puede ser un buen ejercicio (A) tratar de hacer esa tarea, solo por el aprendizaje / divertimento / reto que ello supone. Desde este punto de vista, quizá fuera interesante no solo buscar duplicados en fotos, sino con cualquier tipo de archivo.
Pero hay personas que sí suelen tener fotos duplicadas. Por ejemplo, los usuarios de Whatsapp que reciben una foto y con cierta frecuencia la reenvían a otros. Whatsapp genera un archivo duplicado, e incluso es posible (no estoy seguro) de que haga duplicados adicionales si le envías la imagen a varias personas. Pero en este caso (B) ya tienes unas pistas muy claras para buscar fotos duplicados, y me refiero a los directorios o carpetas de Whatsapp que alojan las imágenes.
Por otro lado, hay que tratar de encontrar indicios que faciliten la identificación de los archivos duplicados. Yo creo que los indicios evidentes son el tipo de archivo y su tamaño. Si los dos archivos tienen tipos distintos o tamaños diferentes ya es evidente que no hay similitud, y damos el tema por zanjado. Si ambos datos coinciden en los dos ficheros... seguramente convenga una comparación más detallada como la que propone Willy con el método MD5 (muy buen apunte).
También hay que plantear cómo proceder cuando encontremos dos (o más) archivos idénticos. ¿Cuál quedará y cuál (o cuáles) hay que borrar? Es una decisión importante, que no debe tomarse a la ligera y que depende del planteamiento del problema [caso (A) o caso (B)].
Finalmente, me parece "suicida" utilizar un comando RM que borraría todas las fotos de una carpeta, porque lo hace sin discriminar las que puedan estar duplicadas o las que no lo están.
Quizá convendría reiniciar el problema con un planteamiento claro y concreto. En mi opinión, seguramente merezca la pena partir de la tarea que hizo jmajenjo (julio 2013), pues sospecho que es fácil modificarla para que afecte a distintos directorios, y tiene varias ventajas importantes, como el procesamiento en bucle, o que maneja los nombres de archivo en variables y también que hace un borrado selectivo, de un archivo cada vez.
http://www.htcmania.com/showthread.php?p=9377579
Mitrhandir
21/02/16, 09:08:13
Hola Caravantes! Sin duda mi opción es la "A". Porque se me ocurre una idea, la planteo sobre papel y luego trato de plasmarla en Tasker. Y aquí es donde viene lo divertido: te rompes la cabeza y estrujas las neuronas tratando de conseguir, máxime cuando soy irremediablemente cabezón por naturaleza. Prefiero estar "trasteando" y tratar de hacer mi teléfono un poco más "inteligente".:risitas:
Pero en parte tienes razón: estoy muy perdido y no me duele prendas reconocerlo, pero ello no significa que no quiera aprender, au contraire, lo deseo fervientemente.
Por eso, la mejor manera de aprender es practicar y equivocarte.
Sin más, quiero hacer presente mi admiración por todos vosotros, :aplausos: porque os leo y se me queda cara de tonto. Espero que ocurra cada vez menos, puesto que tendré más experiencia. :ok::cucu:
Un saludo!
WillyWeb
21/02/16, 10:37:39
... Desde este punto de vista, quizá fuera interesante no solo buscar duplicados en fotos, sino con cualquier tipo de archivo.
Ya me has fastidiado la sorpresa :cry:
Tal y como pensaba enfocarlo la tarea final podría eliminar cualquier archivo duplicado (fotos/vídeos/audios) de WhatsApp.
... Si ambos datos coinciden en los dos ficheros... seguramente convenga una comparación más detallada como la que propone Willy con el método MD5.
Pues sí, se podrían combinar ambas cosas y conseguir un procesamiento mucho más eficiente. :ok:
También hay que plantear cómo proceder cuando encontremos dos (o más) archivos idénticos. ¿Cuál quedará y cuál (o cuáles) hay que borrar? Es una decisión importante, que no debe tomarse a la ligera y que depende del planteamiento del problema [caso (A) o caso (B)].
Cierto. Yo eliminaría el más viejo, es decir, el primero que me encuentre en la lista.
Finalmente, me parece "suicida" utilizar un comando RM que borraría todas las fotos de una carpeta, porque lo hace sin discriminar las que puedan estar duplicadas o las que no lo están.
Indudablemente es un planteamiento y solución incorrectos. :oh:
En mi opinión, seguramente merezca la pena partir de la tarea que hizo jmajenjo (julio 2013), pues sospecho que es fácil modificarla para que afecte a distintos directorios, y tiene varias ventajas importantes, como el procesamiento en bucle, o que maneja los nombres de archivo en variables y también que hace un borrado selectivo, de un archivo cada vez.]
Pues sí y no. Si lees con detenimiento la tarea podrás ver que la solución todavía es peor que el comando "rm *.jpg". En el caso de la tarea se eliminan TODOS los archivos sin contemplaciones. Eso sí, se hace de forma secuencial con un bucle, que es lo único aprovechable para este nuevo planteamiento. :rolleyes:
Me queda mucho recorrido y muchas ideas en el tintero para ir dando forma dentro de esta grandísima aplicación.
Un saludo! :cucu:
¿Cómo que :cucu:? ... ni de coña. :boxeo:
Ahora mismo te pones a comprobar cuánto tiempo cuesta comparar dos fotos con "cmp" y cuánto tiempo cuesta calcular sus hash md5.
Estoy esperando :palomitas:
Mitrhandir
21/02/16, 14:28:51
WillyWeb, tengo las ideas en mi cabeza, pero no sé plasmarlo aquí. Pero tampoco me lo des hecho. Estímulame! Tengo clara la condición que sería a las 4 de la mañana y sólo cargando. Entonces habría que crear/establecer la variable %Condición y darle valor on. Pero el comando md5 no tengo ni idea de cómo ejecutarlo ni cómo sería el texto. Aún así, voy a buscar u trataré de hacer el comando yo. A ver si te sorprendo! :risitas:
WillyWeb
21/02/16, 15:12:03
Tengo clara la condición que sería a las 4 de la mañana y sólo cargando. Entonces habría que crear/establecer la variable %Condición y darle valor on...
Todo eso después. :D
Pero el comando md5 no tengo ni idea de cómo ejecutarlo ni cómo sería el texto. Aún así, voy a buscar u trataré de hacer el comando yo.
Te lo voy a poner fácil :rolleyes:
Antes te he recomendado una app de terminal para que hagas pruebas...
https://play.google.com/store/apps/details?id=jackpal.androidterm
Te creas una carpeta en la memoria del teléfono...
/sdcard/pruebas
Y metes en ella media docena de archivos (fotos o lo que quieras) con nombres cortos para que sean fáciles de escribir.
Luego, usando esa aplicación de terminal, te vas a esa carpeta...
cd /sdcard/pruebas
Y estando ya en ella haces esas comprobaciones que te he propuesto...
cmp foto1.jpg foto2.jpg
md5 foto1.jpg
Y miras qué sale, cuánto tarda, qué pegas te encuentras. En las comparaciones es interesante que hagas la prueba con archivos de diferentes tamaños, con archivos que sean totalmente diferentes y con archivos iguales. Me he encontrado con algo en lo que no había pensado y que abre una nueva opción para verificar si una foto está duplicada. :silbando:
Por cierto, esos comandos son los mismos que luego tendrás que poner en la acción de consola de Tasker. Si aprendes/entiendes su manejo en el terminal sabrás como tratarlos en Tasker.
Mitrhandir
21/02/16, 15:39:30
127|u0_a187@hwG7-L01:/ $ cd /storage/sdcard1/pruebas
mp leo.jpg ay.jpg <
leo.jpg ay.jpg differ byte 164
d5 leo.jpg ay.jpg <
0908755127c01746b4745812e5085fb6 leo.jpg
eb3abe9c7ca3d8ae4b34fb6bb45f7333 ay.jpg
u0_a187@hwG7-L01:/storage/sdcard1/pruebas $
WillyWeb, aquí tienes lo que me has pedido. La conclusión de a la que llego es que el primer comando digamos "resta" la suma de las 2 fotos, es decir, te dice la diferencia de bytes. Y el segundo comando, tengo la intuición de que nos "dice" digamos el número de serie de las 2 fotos, que claramente son distintas. Bien, ése es el estímulo! Está empezando a parpadear la bombillita! :silbando:
WillyWeb
21/02/16, 18:24:12
La conclusión de a la que llego es que el primer comando digamos "resta" la suma de las 2 fotos, es decir, te dice la diferencia de bytes.
El comando "cmp" hace una comparación byte a byte de dos archivos y te dice en qué son diferentes. En su forma predeterminada (tal y como tú lo has ejecutado) la comparación se detiene al encontrar la primera diferencia. Si te fijas bien verás que el resultado es el nombre de los dos archivos y ...
differ byte 164
...que es el primer byte en el que ambos archivos ya no coinciden.
Y el segundo comando, tengo la intuición de que nos "dice" digamos el número de serie de las 2 fotos, que claramente son distintas.
El comando "md5" es uno de los muchos sistema de calcular el "hash (https://es.wikipedia.org/wiki/Funci%C3%B3n_hash)" de un archivo. El hash (se podría traducir como resumen) es una representación compacta (con un tamaño fijo) de algo que tiene un tamaño mucho mayor y variable (como el archivo de una foto).
Si te fijas verás que el resultado de procesar el archivo leo.jpg es "0908755127c01746b4745812e5085fb6" que es la representación en 32 bytes (conforme al sistema MD5) de los miles de bytes que seguro tenía ese archivo. La gracia del sistema MD5 es que es casi imposible que dos archivos diferentes tengan el mismo hash. Y comparar dos cadenas de texto de 32 bytes es una chorrada.
Bien comparando los archivos directamente o bien comparando sus hash podemos saber con total certeza si dos archivos son iguales.
De lo que se trata de es averiguar con qué sistema tardaremos menos en comparar 100 fotos. ¿Tú qué dices? :silbando:
Mitrhandir
21/02/16, 19:21:17
Bien, me ha quedado claro que el método con md5 es mucho más rápido.
Manos a la obra:
Perfil: Duplicated Pics
Condición: cargando cargador
Condición: a las 4 a.m.
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
Aunque sé que el perfil está mal sé que me estoy acercando. Faltaría darle el valor a %Duplicados y hacer algo más que se me escapa.
Así es como uno aprende! Mola!:platano:
WillyWeb
21/02/16, 20:30:19
Bien, me ha quedado claro que el método con md5 es mucho más rápido.
¿Estás seguro de eso? :silbando:
Prueba1 (666)
A1: Establecer variable [ Nombre:%archivo1 A:/sdcard/temp/foto1.jpeg Calcular:Apagado Añadir:Apagado ]
A2: Establecer variable [ Nombre:%archivo2 A:/sdcard/temp/foto2.jpeg Calcular:Apagado Añadir:Apagado ]
A3: Establecer variable [ Nombre:%archivo3 A:/sdcard/temp/foto3.jpeg 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:Apagado Almacenar Salida En:%salida ]
A7: Ejecutar consola [ Comando:cmp %archivo1 %archivo2 Cuenta atrás (segundos):0 Usar Root:Apagado Almacenar Salida En:%salida 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 ]
-Pon en A1/A2/A3 la ruta a tres archivos. A1 y A2 deben ser diferentes. A3 debe ser igual que A2. Procura que sean grandes, de unos cuatro o cinco megas mínimo.
-Comenta la acción A7 (te quedas pulsando y luego tocas el botón de apagado de la barra superior). Ejecuta la tarea un par de veces tomando nota del valor que sale al final en el flash. Es el tiempo de ejecución en milisegundos de calcular 50 veces el hash del archivo que pongas (procura usar el mayor).
-Ahora comenta la acción A6 y descomenta la A7. Ejecuta la tarea un par de veces y toma nota del valor del flash. Repite esa ejecución con los archivos diferentes y con los archivos iguales. Eso es el tiempo en milisegundos que se tarda en comparar 50 veces el par de archivos que pongas (iguales y diferentes).
Al final deberías tener los tiempos de...
calcular md5
comparar archivos diferentes
comparar archivos iguales
Te espero :palomitas:
PD: La prueba no es del todo correcta porque se usan siempre los mismos archivos y eso desvirtúa los resultados al ignorar el tiempo de lectura, pero creo puede valer como aproximación. Lo importante no es el valor que salga, sino la diferencia entre los distintos valores.
Caravantes
21/02/16, 20:58:39
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.
Mitrhandir
21/02/16, 21:09:49
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! :risitas:
WillyWeb
21/02/16, 21:22:16
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. :oh:
Aquí está, aunque A6 me da este error
Lo esperaba. Por eso la acción tiene puesta la marca de "Continuar Tarea Tras Erro". ;-)
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? :oh:
WillyWeb
21/02/16, 21:44:37
... 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. :silbando:
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. :loco:
Mitrhandir
21/02/16, 22:02:57
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. :risitas:
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! :cucu:
WillyWeb
21/02/16, 22:08:16
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).
Entonces, vamos a limitarnos a archivos .jpg del WhatsApp, porque comparar todos los archivos puede llevar mucho tiempo.
No necesariamente.
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.
Todo sea como bien dice Caravantes, simplificar la tarea.
Caravantes es un optimista nato. :risitas:
Caravantes
21/02/16, 22:19:38
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.
Caravantes
21/02/16, 23:20:46
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/software/misjavascript/javascript_combinatorio2.html#7
Mitrhandir
21/02/16, 23:29:35
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. :sisi1:
WillyWeb
22/02/16, 08:26:50
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. :rolleyes:
WillyWeb
22/02/16, 08:29:40
...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. :oh:
WillyWeb
22/02/16, 13:04:32
Lo tenía todo en la cabeza y por fin he sacado un rato para escribirlo en Tasker. :D
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. :sisi1:
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. :oh: Con mi sistema he detectado los 19 posibles duplicados en 11 segundos. ;-)
Esto marcha :ok:
Caravantes
22/02/16, 20:02:45
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.
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.
WillyWeb
22/02/16, 21:43:16
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). :rolleyes:
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. :silbando:
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? :oh:
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. :D
Mitrhandir
22/02/16, 23:33:25
Hola! Lo siento, hoy he tenido un día completo y ahora he podido relajarme un poco.
Yo lo estoy flipando. :aplausos:
Caravantes
23/02/16, 03:43:21
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.
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).
:risitas: :risitas:
WillyWeb
23/02/16, 10:16:01
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.
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.
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. ;-)
WillyWeb
23/02/16, 21:46:31
Aquí os dejo la tarea que elimina archivos duplicados de cualquier carpeta y de cualquier tipo (siempre que la carpeta no requiera permisos especiales)... :rolleyes:
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. :loco:
...
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...
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 ]
Caravantes
23/02/16, 23:56:01
Aquí os dejo la tarea que elimina archivos duplicados de cualquier carpeta y de cualquier tipo
Fantástico, Willy. :mola:
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ó. :aplausos: :aplausos:
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.
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í...
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)
WillyWeb
24/02/16, 08:45:51
- 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.
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. :oh:
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. :cry:
...
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). :loco:
Caravantes
24/02/16, 13:25:18
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.
WillyWeb
24/02/16, 19:55:46
... 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. :sisi1:
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. :silbando:
Al tema...
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 :rolleyes:
leromaro
24/02/16, 22:06:42
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!!!
WillyWeb
24/02/16, 22:17:18
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.
Mitrhandir
24/02/16, 23:00:42
WillyWeb, lo que has creado me viene muy grande! Tienes mi admiración! Ahora a ver cómo acomodo esto en mi tasker... :dios:
leromaro
24/02/16, 23:11:42
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.
WillyWeb
25/02/16, 08:29:23
WillyWeb, lo que has creado me viene muy grande! ... Ahora a ver cómo acomodo esto en mi tasker
¿Muy grande? :oh: ¿qué parte no entiendes?
Y, ¿cómo metes eso en tu Tasker? ... pues paso a paso :risitas:
-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".
WillyWeb
25/02/16, 08:44:38
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.
ruco1980
25/02/16, 10:33:19
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 :risitas::aplausos::aplausos:
mlsir......hay que ir retomando las buenas costumbres....WillyWeb se ha ganado la copa y hay que subir la tarea al recopilatorio :risitas:
:campeon::campeon:
WillyWeb
25/02/16, 10:41:33
En cuanto me tome la pastillita de NZT me pongo a transcribir la tarea...
Calla que descubres mi secreto. X-D
...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.
Caravantes
25/02/16, 13:08:49
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?
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>
WillyWeb
25/02/16, 13:39:23
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. :ok:
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. :rolleyes: En lo que tenga un rato lo pruebo y os cuento. :silbando:
Caravantes
25/02/16, 16:54:05
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).
WillyWeb
25/02/16, 18:21:10
... 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. :rolleyes:
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. :oh:
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. ;-)
WillyWeb
25/02/16, 22:31:05
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? :oh:
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. :cry:
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 :cucu:
Caravantes
25/02/16, 23:30:18
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.
Mx WaR HaBiB
26/02/16, 00:06:56
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! :-)
WillyWeb
26/02/16, 12:50:55
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...
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í...
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 :D
Caravantes
26/02/16, 18:56:37
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.
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.php?p=22207586#post22207586
Además, en ese primer post, entras en edición avanzada y cambias el prefijo del título (Consulta) poniendo SOLUCIONADO. Gracias.
Mitrhandir
26/02/16, 19:33:16
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 :cucu:
WillyWeb
26/02/16, 20:05:39
Creo que, en ese post, justo tras esa frase convendría que añadieras unas explicaciones del tipo que pusiste en la primera tarea...
Listo. :ok:
ruco1980
29/02/16, 10:27:24
Buenas a todos....he transcrito la tarea al completo...es genial...aunque hay alguna creación de variables etc...que no comprendo muy bien....
El caso es que no consigo que me funcione....a pesar de que la tarea no me ejecuta ningún error...
He cogido 6 fotos de mi carpeta WhatsApp/Media/WhatsApp Images y las he copiado dentro de la carpeta /Sent, es decir son 6 archivos exactamente iguales....
Ejecuto la tarea y no aparece ningún error, me devuelve el resultado con el tiempo que tarda, los bytes que se borrarían etc...y efectivamente en ese resultado me dice 6 (los archivos que son iguales), pero luego voy al explorador y las imágenes no se han borrado....la ruta de acceso está bien escrita....
Si en las acciones de "ejecutar consola" y "eliminar archivo" marco la casilla "usar root" el resultado es el mismo, no me borra las imágenes....
¿Se os ocurre qué puede estar ocurriendo?
Saludos
WillyWeb
29/02/16, 10:50:14
... me devuelve el resultado con el tiempo que tarda, los bytes que se borrarían etc...
Eso indica claramente que las carpetas son correctas y que encuentra los duplicados. Si las carpetas fueran incorrectas la subtarea devolvería "VACIO".
... pero luego voy al explorador y las imágenes no se han borrado....
Pues parece que la acción que falla es la de eliminar archivo (A32), y podría ser porque Tasker no tenga acceso para eliminar archivos de esa carpeta.
-¿Versión de Android?
-¿Rutas que estás usando?
-¿Tienes WhastApp en la memoria interna o en la SD?
Rellena adecuadamente las acciones A2 y A3 (carpetas y tipos de archivo), quita la marca de "Continuar Tarea Tras Error" de A32 y corre la tarea directamente desde el UI.
ruco1980
29/02/16, 11:04:02
Gracias por contestar WillyWeb...
La versión de android es 5.1 aosp....las rutas las tengo establecidas como /storage/sdacard0/WhatsApp/Media/WhatsApp Images...y la segunda.../Sent
WhatsApp guarda los archivos en la memoria interna del tléfono que es donde está instalado y la memoria interna es sdcard0 y la externa sdcard1....
Si desmarco la casilla "continuar tarea tras error"en la acción de "eliminar archivo" entonces la tarea da error al lanzarla desde el UI de tasker directamente....si lo marco la tarea continua pero efectivamente no elimina los archivos...
WillyWeb
29/02/16, 11:59:03
Si desmarco la casilla "continuar tarea tras error" en la acción de "eliminar archivo" entonces la tarea da error al lanzarla desde el UI de tasker directamente...
-Comprueba que has escrito bien el nombre de la variable (%file1).
-Coloca un flash antes/después de la acción de eliminar para ver el contenido de %file1.
-Prueba cambiando "/storage/sdacard0/" por "/sdcard/" (suele ser otra forma de llamar a la memoria interna).
-Y comprueba que Tasker puede escribir/borrar en la memoria interna. **
** Haz una tarea de prueba con una acción "Escribir archivo". En "Archivo" pones "/storage/sdacard0/prueba.txt" y en "Texto" cualquier cosa.
ruco1980
29/02/16, 13:30:24
Pues no encuentro el error...expediente x :risitas:
Si cambio la ruta sdcard0 a sdcard aparece el flash de listado de archivos no encontrado, por lo que la ruta con sdcard0 está bien escrita....
Tasker tiene los permisos concedidos en ajustes, permisos de aplicaciones, tengo puesto que tenga acceso a todos los permisos.....al crear una tarea de escribir archivo el archivo prueba.txt se crea correctamente en la memoria interna del dispositivo con el texto que le pongo, por lo que permisos de acceso y escritura a la memoria interna tiene.
La variable %file1 está bien escrita, si coloco una acción de alerta flash antes y después de la acción eliminar archivo el contenido de %file1 es el mismo, en este caso dos archivos (he dejado sólo 2 archivos iguales en la carpeta Sent para minimizar las pruebas)...
En la descripción de tu tarea dices esto: "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".
Yo tan sólo he invertido el orden poniendo primero %carpeta1, ya que los que quiero que se conserven son los de la carpeta Images, y quiero que se borren los de la carpeta Sent; pero este cambio está dentro de la tarea donde aplico la subtarea con la acción realizar tarea....por lo que no debería influir.
en la tarea principal cambio la acción 2 y pongo
establecer variable %par1 A /storage/sdcard0/WhatsApp/Media/WhatsApp Images,/storage/sdcard0/WhatsApp Images/Sent......que son las dos carpetas a comparar...
y la siguiente acción: establecer variable %par2 A *.jpeg/*.jpg/*.gif
Y lanzo la tarea con el play desde la UI de Tasker...
WillyWeb
29/02/16, 13:57:12
Si cambio la ruta sdcard0 a sdcard aparece el flash de listado de archivos no encontrado, por lo que la ruta con sdcard0 está bien escrita...
Lo que te proponía era cambiar "/storage/sdacard0/" por "/sdcard/", no sólo "sdcard0". De todas formas eso ya no importa por lo que cuentas después.
...al crear una tarea de escribir archivo el archivo prueba.txt se crea correctamente en la memoria interna del dispositivo con el texto que le pongo, por lo que permisos de acceso y escritura a la memoria interna tiene.
Por eso te digo que lo de antes no importa.
La variable %file1 está bien escrita, si coloco una acción de alerta flash antes y después de la acción eliminar archivo el contenido de %file1 es el mismo, en este caso dos archivos (he dejado sólo 2 archivos iguales en la carpeta Sent para minimizar las pruebas)
¿Y si creas dos carpetas colgando directamente de la raíz y pones los archivos de prueba en ellas?
Yo tan sólo he invertido el orden poniendo primero %carpeta1, ya que los que quiero que se conserven son los de la carpeta Images, y quiero que se borren los de la carpeta Sent...
Eso es correcto y no debería ser causante del error.
...
Exporta la descripción de la tarea que has escrito tú y la pones aquí. Lo mismo es una chorrada que otros ojos encuentran. :oh:
ruco1980
29/02/16, 14:52:10
He creado dos carpetas en la raíz de la memoria interna, imagenes e imagenescopias....y pongo dos fotos en el interior de cada carpeta, las dos fotos iguales....ejecuto la tarea y nada....
He puesto una foto en la raíz de la memoria interna y he creado una tarea de prueba con una única acción de eliminar archivo...y lo elimina sin problemas.....después dentro de la carpeta imagenescopias hemetido la foto y con la acción eliminar archivo señalando esa foto del interior de la carpeta también funciona y la elimina sin problema...por lo que acceso al interior de carpetas también funciona bien de la acción "eliminar archivo" de Tasker....
Así que lo único que se me ocurre es que algo esté funcionando mal en el método de comparación de archivos de la tarea principal y se ejecute completamente sin lanzar ningún error, pero luego no borra las fotos...pero ya no sé por dónde puede estar el error...
WillyWeb
29/02/16, 15:13:14
... lo único que se me ocurre es que algo esté funcionando mal en el método de comparación de archivos ...
Si la tarea termina dando el total de archivos y bytes eliminados la comparación de duplicados funciona bien.
Haz una prueba loca...
-Quita la acción de eliminar archivos
-Sal de la edición de la tarea y de Tasker
-Entra de nuevo a Tasker y edita la tarea
-Añade de nuevo la acción de eliminar archivo
Y por cierto, ¿has probado a reiniciar el móvil?
:rolleyes:
ruco1980
29/02/16, 15:53:35
He hecho la prueba loca y reiniciar el móvil y nada....jajaj
Bueno...he clonado la tarea para no tocar la original y he creado la tarea BorraDuplicados2
En esa tarea cambio la acción 2 para poner las rutas a comparar y poner las que hemos hablado antes de las carpetas que he creado en la raiz directamente de imagenes e imagenescopias...que contienen cada carpeta dos fotos iguales...
Al ejecutar la tarea desde el UI de tasker me sale un error en la acción de ejecutar consola....ahí tiene que ser casi seguro donde esté el error....
WillyWeb
29/02/16, 16:34:56
Al ejecutar la tarea desde el UI de tasker me sale un error en la acción de ejecutar consola....ahí tiene que ser casi seguro donde esté el error....
La imagen me ha dado la pista definitiva. Las variables %file1 y %file2 no deberían contener esos <a> </a> <b> </b>
Revisa las acciones A12 y A23 (de paso mira también A25), una de ellas está mal escrita.
ruco1980
29/02/16, 18:10:22
Pues parece que no hay error, pero ya me estoy volviendo loco......igual no lo veo....
Así es como tengo la tarea principal:
BorraDuplicados (147)
<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 (se tiene en cuenta su orden); y en %par2 el/los tipo/s de archivos a procesar. La tarea devuelve cuatro valores separados por comas: archivos procesados, archivos borrados, bytes borrados y milisegundos empleados.>
A1: Anchor
A2: Establecer variable [ Nombre:%par1 A:/storage/sdcard0/tmp2,/storage/sdcard0/tmp1 Calcular:Apagado Añadir:Apagado ] Si (if) [ %caller1 ~ ui ]
A3: Establecer variable [ Nombre:%par2 A:*.jpeg/*.jpg Calcular:Apagado Añadir:Apagado ] 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 Calcular:Apagado Añadir:Apagado ]
A6: Separar variable [ Nombre:%par1 Separador:, Eliminar base:Apagado ]
A7: Establecer variable [ Nombre:%peso A:100 Calcular:Apagado Añadir:Apagado ]
A8: For [ Variable:%carpeta Ítems:%par1() ]
A9: Restar de variable [ Nombre:%peso Valor:1 Módulo (wrap around):0 ]
A10: Listar archivos [ Directorio:%carpeta Coincidir:%par2 Incluir Archivos Ocultos:Apagado Usar Root:Apagado 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 Usar Root:Apagado Continuar Tarea Tras Error:Encendido ]
A13: Sumar a variable [ Nombre:%chk Valor:1 Módulo (wrap around):0 ]
A14: Establecer variable [ Nombre:%archivos(%chk) A:<b>%bytes</b>%peso<a>%archivo</a> Calcular:Apagado Añadir:Apagado ]
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 Añadir:Apagado ]
A20: Establecer variable [ Nombre:%filesbor A:0 Calcular:Apagado Añadir:Apagado ]
A21: Establecer variable [ Nombre:%bytesbor A:0 Calcular:Apagado Añadir:Apagado ]
A22: For [ Variable:%chk Ítems:1:%finchk ]
A23: Establecer variable [ Nombre:%sigchk A:%chk+1 Calcular:Encendido Añadir:Apagado ]
A24: Establecer variable [ Nombre:%archivos A:%archivos(%chk) %archivos(%sigchk) Calcular:Apagado Añadir:Apagado ]
A25: Buscar y Reemplazar Contenido de Variable [ Variable:%archivos Buscar:(?<=<b>).*?(?=</b>) Ignorar Caso:Apagado Multilínea:Apagado Una sola coincidencia:Apagado Almacenar Coincidencias En:%bytes Reemplazar Coincidencias:Apagado Reemplazar Con: ]
A26: Si (if) [ %bytes1 = %bytes2 ]
A27: Buscar y Reemplazar Contenido de Variable [ Variable:%archivos Buscar:(?<=<a>).*?(?=<a>) Ignorar Caso:Apagado Multilínea:Apagado Una sola coincidencia:Apagado Almacenar Coincidencias En:%file Reemplazar Coincidencias:Apagado Reemplazar Con: ]
A28: Ejecutar consola [ Comando:cmp %file1 %file2 Cuenta atrás (segundos):0 Usar Root:Apagado Almacenar Salida En:%salida Almacenar Errores En: Almacenar Resultado en: Continuar Tarea Tras Error:Encendido ]
A29: Si (if) [ %salida No ajust. ]
A30: Sumar a variable [ Nombre:%filesbor Valor:1 Módulo (wrap around):0 ]
A31: Sumar a variable [ Nombre:%bytesbor Valor:%bytes1 Módulo (wrap around):0 ]
A32: Eliminar archivo [ Archivo:%file1 Nivel de Borrado:0 Usar Root:Apagado 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 Añadir:Apagado ]
A37: Flash [ Texto:%archivos(#),%filesbor,%bytesbor,%tictac Largo:Encendido ] Si (if) [ %caller1 ~ ui. ]
A38: Devolver [ Valor:%archivos(#),%filesbor,%bytesbor,%tictac Detener:Encendido ]
WillyWeb
29/02/16, 18:58:36
Vale. Me he confundido de versión (he mirado la que no priorizaba las carpetas) y te he indicado números de acción incorrectos. :cry:
En la versión correcta (la que tú has puesto) las acciones que tienes que revisar son A14 (que está bien), A25 (que parece que está bien, aunque sale un icono y no te lo puedo asegurar) y A27 (que tiene un error, falta la barra en la segunda <a>).
Edito: Ahora que me fijo, en la imagen que has puesto antes también se podía ver el fallo de A27. :(
Caravantes
29/02/16, 23:21:28
A27: Buscar y Reemplazar Contenido de Variable [ Variable:%archivos Buscar:(?<=<a>).*?(?=<a>)
Ruco, al poner "código" en uno de estos posts del foro, es preferible envolverlo siempre con las etiquetas CODE (cuadro de edición avanzada, icono de una almohadilla, al situar el puntero del ratón sobre ese icono aparece el texto "Envolver etiquetas [CODE]").
De ese modo, el mismo texto que tú has puesto, es presentado de esta otra forma:
A27: Buscar y Reemplazar Contenido de Variable [ Variable:%archivos Buscar:(?<=<a>).*?(?=</a>)
La ventaja de este sistema es que el servidor del foro no intentará conversiones a Smileys o caritas. Por ejemplo, si no usas este sistema... cuando escribas dos puntos seguidos de un paréntesis de apertura, el servidor lo convertirá en un smiley triste. Pero si lo haces mediante etiquetas CODE, el servidor no hará esa conversión.
:(
:(
Resumiendo, si no ponemos las etiquetas CODE, ocurre que podemos perder de vista algunos caracteres (en este caso, los dos puntos y el parénteis), como puedes ver en tu propio post o en el fragmento que yo he reproducido al principio de este mensaje.
Es un detalle poco importante, que nadie se sienta culpable por este pequeño desliz o desconocimiento.
ruco1980
29/02/16, 23:23:54
Muchas gracias WillyWeb..... Efectivamente el fallo estaba en la acción 27 que faltaba la /....
Me faltaba una lección de chino mandarín y por eso no lo localizaba :risitas:
Ya tengo la tarea funcionando perfectamente.
Gracias de nuevo! :dios:
WillyWeb
29/02/16, 23:27:42
... Efectivamente el fallo estaba en la acción 27 que faltaba la /...
Pues me alegro de que ya te funcione. :ok:
ruco1980
29/02/16, 23:29:00
Gracias Caravantes..... Antiguamente creo que cuando copiábamos la descripción de las tareas no ocurría eso.... Luego siempre me he preguntado por qué aparecían los emoticonos... Y me parecía algo tan tonto que no me atrevía a preguntar jejej....
Luego os veía poner las tareas en formato código y no tenía ni idea de cómo se hacía y me daba cosa preguntar... La verdad culpa mía y tonto por no preguntar :cry:
A partir de ahora utilizaré esa forma... Que por otro lado me has dejado clarísimo cómo se hace....:gracias:
Buenas, estoy intentando crear una tarea para borrar fotos en la carpeta de cámara y de Telegram. Me duplica al enviar una foto.
He leído el hilo pero no me ha quedado claro y, me parece que la tarea es demasiado compleja para lo que yo necesito. A ver si alguno me hecha una mano. Gracias.
Enviado desde mi LG-D802 mediante Tapatalk
WillyWeb
14/07/16, 23:08:09
Buenas, estoy intentando crear una tarea para borrar fotos en la carpeta de cámara y de Telegram. Me duplica al enviar una foto.
He leído el hilo pero no me ha quedado claro y, me parece que la tarea es demasiado compleja para lo que yo necesito.
Si los archivos que quieres eliminar de esas carpetas son exactamente iguales (tienen el mismo tamaño y contenido) esta tarea es justo lo que necesitas y hace su trabajo de la manera más simple posible.
¿Dónde te has atascado? :oh:
Si los archivos que quieres eliminar de esas carpetas son exactamente iguales (tienen el mismo tamaño y contenido) esta tarea es justo lo que necesitas y hace su trabajo de la manera más simple posible.
¿Dónde te has atascado? :oh:
No entiendo por ejemplo para que sirve el if %caller1 ~ ui.
Luego en las tareas A14 A25 y A27 no entiendo: que es o para que está lo que está entre <>
<b>%bytes</b>%peso<a>%archivo</a>
(?<=<a>).*?(?=</a>)
¿Se pone así tal cual?
Después de ejecutar la tarea directamente desde tasker parece que no borra los archivos (si quito el ejecutar tarea tras error no da ningún error, como si n entrará en el if [%bytes1 = %bytes2]).
Me devuelve 6,0,0, 86
Entiendo que:
6 es el número de archivos en total entre las dos carpetas, incluso los que no son iguales. No se si eso es así o es que no está comparando los archivos.
Los 0 son en número de archivos y bytes borrados
Y 86 el tiempo de ejecución.
Edito2: ahora de repente no funciona, me da un error al borrar los archivos. Aunque me da un resultado con osi si hubiese borrado alguna foto.
09.26.37/Variables doreplresult: |cmp %file1 %file2| -> |cmp /storage/emulated/0/DCIM/Camera/20160705_171755_HDR.jpg %file2|
09.26.37/Variables doreplresult: |cmp %file1 %file2| -> |cmp /storage/emulated/0/DCIM/Camera/20160705_171755_HDR.jpg %file2|
09.26.37/E Ejecutar consola: %salida -> %salida
09.26.37/E Ejecutar consola: ->
09.26.37/E Ejecutar consola: ->
09.26.37/Shell runBackground cmp /storage/emulated/0/DCIM/Camera/20160705_171755_HDR.jpg %file2 root: false timeout: -1
09.26.37/Shell start process-thread ID 207
09.26.37/E add wait type Shell1 time 2147483647
09.26.37/E add wait type Shell1 done
Enviado desde mi LG-D802 mediante Tapatalk
No entiendo por ejemplo para que sirve el if %caller1 ~ ui.
Luego en las tareas A14 A25 y A27 no entiendo: que es o para que está lo que está entre <>
<b>%bytes</b>%peso<a>%archivo</a>
(?<=<a>).*?(?=</a>)
¿Se pone así tal cual?
Después de ejecutar la tarea directamente desde tasker parece que no borra los archivos (si quito el ejecutar tarea tras error no da ningún error, como si n entrará en el if [%bytes1 = %bytes2]).
Me devuelve 6,0,0, 86
Entiendo que:
6 es el número de archivos en total entre las dos carpetas, incluso los que no son iguales. No se si eso es así o es que no está comparando los archivos.
Los 0 son en número de archivos y bytes borrados
Y 86 el tiempo de ejecución.
Enviado desde mi LG-D802 mediante Tapatalk
No me deja editar el mensaje correctamente desde tapatalk. Acabo de caer en que en el if %byted1 y %bytes2 tenía un igual normal,no matemático. La tarea funciona perfectamente. Aún así si pudieras aclararme esos puntos sería genial. Muchísimas gracias.
Enviado desde mi LG-D802 mediante Tapatalk
WillyWeb
15/07/16, 09:55:55
Todo lo que preguntas está explicado con detalle a lo largo de este tema. Puede que tengas que hacer una segunda lectura del hilo. Particularmente deberías leer, con mucha clama, esto...
http://www.htcmania.com/showthread.php?t=1144601&page=3 ... mensaje #58
Si quieres más detalles sobre el uso de %caller1 lee este otro tema... http://www.htcmania.com/showthread.php?t=1202566
Y las acciones, y sus parámetros, se tienen que escribir tal y como están ... si quieres que hagan lo que se esperas de ellas, claro. :risitas:
Sobre ese resultado que te devuelve la tarea, también está explicado a lo largo del tema. Si crees que la tarea debería haber borrado algo y no lo ha hecho puede deberse a un error en la transcripción de la tarea o a que los archivos no son realmente iguales.
Todo lo que preguntas está explicado con detalle a lo largo de este tema. Puede que tengas que hacer una segunda lectura del hilo. Particularmente deberías leer, con mucha clama, esto...
http://www.htcmania.com/showthread.php?t=1144601&page=3 ... mensaje #58
Si quieres más detalles sobre el uso de %caller1 lee este otro tema... http://www.htcmania.com/showthread.php?t=1202566
Y las acciones, y sus parámetros, se tienen que escribir tal y como están ... si quieres que hagan lo que se esperas de ellas, claro. :risitas:
Sobre ese resultado que te devuelve la tarea, también está explicado a lo largo del tema. Si crees que la tarea debería haber borrado algo y no lo ha hecho puede deberse a un error en la transcripción de la tarea o a que los archivos no son realmente iguales.
Gracias. He revisado la tarea ya no sé cuántas veces, tengo un par de fotos duplicadas y me sigue dando el error... El caso es que a veces si me funciona, con algunas pruebas...
Enviado desde mi LG-D802 mediante Tapatalk
WillyWeb
15/07/16, 17:33:06
...tengo un par de fotos duplicadas y me sigue dando el error...
¿Qué error?
¿Qué error?
El del post 80
Enviado desde mi LG-D802 mediante Tapatalk
WillyWeb
15/07/16, 19:49:53
Revisa que tienes marcados todos los "Continuar Tarea Tras Error" que estaban puestos originalmente (has comentado que has quitado alguno). Reinicia el móvil. Sin tocar nada más intenta ejecutar la tarea de nuevo.
Revisa que tienes marcados todos los "Continuar Tarea Tras Error" que estaban puestos originalmente (has comentado que has quitado alguno). Reinicia el móvil. Sin tocar nada más intenta ejecutar la tarea de nuevo.
Ya lo he hecho y nada, lo curioso es que ésta mañana, cuando me he levantado funcionaba. Es como si el móvil tuviera que estar un tiempo en reposo para que funcione. Porque siempre que me funciona es después de un rato sin usar.
Enviado desde mi LG-D802 mediante Tapatalk
WillyWeb
16/07/16, 12:03:38
No se puede borrar un archivo que está bloqueado por el sistema (o por una aplicación). Por eso te he dicho que reinicies y "sin tocar nada" ejecutes la tarea. Y por eso están marcados esos "Continuar Tarea Tras Error". Tampoco tiene demasiada importancia. Lo que no borre en un primer intento seguramente lo borrará en otro posterior.
No se puede borrar un archivo que está bloqueado por el sistema (o por una aplicación). Por eso te he dicho que reinicies y "sin tocar nada" ejecutes la tarea. Y por eso están marcados esos "Continuar Tarea Tras Error". Tampoco tiene demasiada importancia. Lo que no borre en un primer intento seguramente lo borrará en otro posterior.
Sigue sin funcionar correctamente, ni reinicios ni nada... da el error en el cmp %file1 %file2 y no hay manera.
Enviado desde mi LG-D802 mediante Tapatalk
WillyWeb
23/07/16, 20:49:51
He revisado de nuevo el error que comentas en el post #80 y tengo la sensación de que tienes algo más escrito.
09.26.37/Variables doreplresult: |cmp %file1 %file2| -> |cmp /storage/emulated/0/DCIM/Camera/20160705_171755_HDR.jpg %file2|
Ese %file2 no debería aparecer si esa variable tuviera valor. Revisa con calma las acciones anteriores al comando de consola.
Mx WaR HaBiB
15/08/17, 20:30:23
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.
Estimado y apreciable WillyWeb disculpa cuando te refieres alas carpetas también estamos contando que puede tener varias sub carpetas dentro de la misma carpeta?
aunado solo en lista los archivos que tienes la terminación "extension (.jpg,.jpeg)", cierto?
gracias de antemano y un fuerte abrazo :aplausos:
WillyWeb
15/08/17, 20:53:37
disculpa cuando te refieres alas carpetas también estamos contando que puede tener varias sub carpetas dentro de la misma carpeta?
aunado solo en lista los archivos que tienes la terminación "extension (.jpg,.jpeg)", cierto?
Tal como está escrita la tarea no procesan subcarpetas, sólo los archivos contenidos en las carpetas especificadas. En cuanto al tipo de archivo, puedes procesar lo que quieras. Inicialmente el sistema fue pensado para procesar fotos duplicadas, pero realmente puede procesar cualquier cosa. La tarea "LimpiaFotosDuplicadasWA" del post #58 es sólo un ejemplo de cómo usar la tarea principal.
vBulletin® v3.8.1, Copyright ©2000-2025, Jelsoft Enterprises Ltd.