Después de varios años existiendo y evolucionando, hoy puedo liberar oficialmente Poda 0.1, la primera versión que considero verdaderamente estable. Los invito a descargarlo de:
https://gitlab.com/alvarezp2000/poda/-/tree/v0.1
Poda es una herramienta avanzada para detectar directorios duplicados y similares, incluso entre dispositivos que no están conectados simultáneamente. A diferencia de los programas tradicionales que escanean un único disco en tiempo real, Poda funciona en dos fases:
- Indiza / indexa el contenido de cada almacenamiento (laptop, servidor, NAS, discos externos, memorias USB, etc.).
- Procesa esos índices para detectar duplicados y similitudes.
Este enfoque permite comparar información entre múltiples dispositivos, incluso si no están disponibles al mismo tiempo.
Uso real, a escala real
Para dar contexto de las capacidades de Poda, hasta ahora he indexado doce almacenamientos distintos y buscado duplicados entre todos ellos a la vez, incluso cuando no viven en el mismo dispositivo:
-
Tres computadoras Linux (dos laptops y una PC de escritorio), incluyendo mi laptop principal.
-
Un NAS Linux NetStora de 1 TB, creado en 2011, con sólo 128 MB de RAM y un sistema Linux pequeño y veterano.
-
Un NAS Linux de 14 TB basado en OpenWRT, corriendo sobre una Raspberry Pi 4 con 8 GB de RAM: Linux moderno, pero con herramientas más limitadas debido a BusyBox.
-
Tres discos duros externos conectados por USB.
-
Cuatro memorias flash USB.
Los dispositivos USB se conectan únicamente para su indización y luego se desconectan de la laptop principal. Aun así, el índice se mantiene útil y consistente.
Durante la indización de los NAS excluí el directorio de Dropbox para evitar falsos positivos, indexándolo sólo en la laptop principal. Gracias a este enfoque, ya he identificado más de 2 TB de respaldos duplicados, con sus ubicaciones exactas.
Este uso real, con hardware heterogéneo, sistemas viejos y modernos, discos que van y vienen, es lo que empujó los cambios que describo a continuación.
¿Qué cambia en Poda 0.1?
Esta versión incluye cambios estructurales importantes que mejoran la estabilidad, predictibilidad y robustez del sistema.
1. Cada entrada de índice termina en un carácter NUL (\0) (no en salto de línea)
Antes, cada entrada del índice terminaba en el carácter fin de línea de Unix. El problema es que en sistemas Unix los nombres de archivo pueden contener cualquier carácter excepto diagonales (/) y NULs (\0). Eso significa que saltos de línea y otros caracteres extraños se permiten como parte del nombre de un archivo.
Esto hacía imposible distinguir de forma completamente confiable entre un fin de línea que formaba parte del nombre del archivo y un fin de línea que termina una entrada de índice. Esto ocasionaba resultados incorrectos y crashes. Debido al tamaño masivo de los índices y las inconsistencias en cada programa para ingresar caracteres de control, buscar y corregir las entradas culpables era complicado y propenso a errores.
Intentar mantener los índices en formato texto habría requerido de un algoritmo que complejo e inherentemente ambiguo. Habría sido imposible garantizar un funcionamiento estable de Poda.
Entonces: ahora cada entrada del índice termina en carácter NUL (\0).
Además de funcionar como corresponde, esto prepara Poda para una futura compatibilidad con Windows, en donde los saltos de línea difieren de Unix.
Este cambio es uno de los pilares de la estabilidad de la versión 0.1.
2. Eliminación del prefijo ./ en rutas
Anteriormente, Poda almacenaba exactamente lo que devolvía find. Dependiendo de cómo se invocara, find podía anteponer ./ a las rutas.
Eso generaba inconsistencias: mientras algunos índices tenían rutas con ./ otros no. Esto significa que el usuario debía recordar cómo había definido cada hamper.
Con este cambio, ahora los índices ya no incluyen el prefijo ./ y las rutas son más naturales, más limpias y más predecibles. Esto facilita conceptualmente el uso de las herramientas de Poda.
3. Corrección en el manejo de resultados de md5sum
md5sum tiene un comportamiento poco conocido: cuando el nombre del archivo contiene ciertos caracteres (como salto de línea), puede anteponer una contradiagonal (\) al hash.
Poda, anteriormente, simplemente leía los primeros 32 caracteres del hash, lo que podía:
- Incluir la contradiagonal como parte del hash
- Truncar el último carácter real
- Reducir ligeramente la entropía del hash
Aunque el riesgo práctico era bajo, no era correcto.
Esto ya fue corregido.
Ahora Poda interpreta correctamente los hashes generados por md5sum.
4. Adición de poda-nul2nl y poda-nl2nul
Para facilitar la manipulación de índices, especialmente para diagnóstico y migraciones, agregué dos herramientas auxiliares:
- poda-nul2nl
- poda-nl2nul
Son simplemente envolturas sobre tr, pensadas para facilitar su uso desde teclado. No contienen textos de ayuda ni ningún otro tipo de procesamiento.
Migración de índices antiguos
Debido a los cambios estructurales, los índices anteriores a 0.1 ya no son compatibles con Poda 0.1.
La forma más simple de migrar es reiniciar el uso de Poda desde cero, o por lo menos, eliminar los índices antiguos:
rm .poda/indexes/<host>/<hamper>/index poda-reindex <host> <hamper>
Esta es una actividad extensa y tardada.
Para quienes quieran reaprovechar los índices existentes lo más posible, existe una forma de migrarlos:
- Eliminar líneas cuyo hash empiece con contradiagonal.
- Quitar el prefijo ./ de las rutas.
- Convertir saltos de línea a NULs.
- Ejecutar poda-reindex.
Esto es delicado pero rápido y permite reaprovechar más del 95% de los índices.
Para cada índice a migrar —digamos, .poda/index/laptop/myhome/index— podríamos ejecutar algo como esto:
cat .poda/index/laptop/myhome/index | grep -v '^\' | sed -e 's: laptop myhome \./: laptop myhome :' | poda-nl2nul > nuevo-indice mv nuevo-indice .poda/index/laptop/myhome/index
Para la mayoría de los usuarios, la opción recomendada es simplemente borrar los índices y reindizar.
Requerimientos y rendimiento
El indizador no requiere de muchos recursos, es muy eficiente. Toma mucho tiempo leer todo el disco y cada índice puede medir desde cientos de megabytes hasta decenas de gigabytes en disco.
El buscador de duplicados (poda-dirdupes.py) es un poco diferente: trabaja con la totalidad del contenido de todos nuestros almacenamientos a la vez. Además, compara cada directorio contra cada otro. Por eso, el buscador tiene una demanda de recursos más alta que otras herramientas.
Para proyectos pequeños, puede requerirse de 4 GB de RAM y ejecutarse en 1 minutos.
Para proyectos medianos, puede requerirse de 12 GB de RAM y ejecutarse en 5 minutos.
Para proyectos muy grandes, puede requerirse de 32 GB de RAM y ejecutarse en 15 minutos.
¿Cómo probar Poda?
Es importante tener en cuenta que Poda nunca borra datos. Sólo lee, indexa procesa y genera reportes. Cualquier decisión de eliminación de archivos es tomada por el usuario tras entender los reportes y haberlos validado.
Yo, como el principal usuario de Poda, he identificado que Poda no es para borrar inmediatamente. El verdadero valor está en detectar patrones, entender o recordar cómo se duplicó la información, redescubrir la intención original de nuestras estructuras de almacenamientos (típicamente respaldos de respaldos). De ahí derivan las mejores decisiones de eliminación.
Por ejemplo: dos directorios pueden haber sido respaldos mutuos y con el tiempo divergieron. Significa que dentro de ellos puede haber subdirectorios más de 90% idénticos pero los raíz no serán reportados como similares. Si uno borra sin analizar, las similitudes se reducirán aún más. En cambio, si uno primero revisa los reportes en búsqueda de patrones, uno puede tomar decisiones más limpias y coherentes, e incluso, reduciendo la probabilidad de borrar información que sí era útil.
Poda es una herramienta para entender tu almacenamiento, no solo para limpiarlo.
La retroalimentación de la comunidad será bien recibida.










