- El problema. El Mac de un desarrollador guardaba 30,18 GB por duplicado. Casi todo estaba en contenedores de otras apps y en repositorios de código, donde borrar una copia no es seguro.
- Lo que descubrimos. Una herramienta que libera espacio borrando archivos podría ofrecer honestamente alrededor del 3 % de esa cifra. APFS puede hacer que dos archivos idénticos compartan sus bloques: los dos se quedan y el espacio vuelve.
- Lo que construimos. Un análisis que hace que las copias compartan almacenamiento en toda la carpeta de inicio. La primera ejecución recuperó 17,21 GB de 8.414 copias en 28 segundos, y después los archivos superaron todas las comprobaciones.
Encontrar archivos duplicados no te dice qué copia puedes eliminar. Un proyecto puede necesitar un archivo en su ruta actual aunque los mismos bytes estén en otro sitio. Medimos 30,18 GB de almacenamiento duplicado en un solo Mac y luego comprobamos cuándo APFS podía recuperar espacio conservando los dos archivos. Lo que puede recuperar tu Mac depende de sus archivos y de qué bloques comparten ya.
Recorrimos la carpeta de inicio de un desarrollador para averiguar qué la estaba llenando: 523.217 archivos, agrupados por el espacio que ocupan realmente. Calculamos el hash cuando dos tamaños coincidían, comparamos byte a byte y descartamos todos los pares que ya comparten sus bloques en el disco. Quedaron 30,18 GB que esa máquina guarda por duplicado, repartidos en 44.830 grupos.
Podríamos habernos quedado ahí y poner 30 GB en una página. Lo que cambió el producto fue leer ese mismo censo de otra manera.
Primero, contar los bytes que existen
En los Mac actuales, la forma más obvia de contar está mal, y se equivoca justo en el sentido que hace quedar bien a una herramienta de almacenamiento.
El tamaño de un archivo y el espacio que ocupa son cifras distintas. Esa carpeta de inicio mide 670,0 GB por tamaño y 225,5 GB por lo que hay en el disco. La mayor parte de la diferencia son 14.759 archivos que iCloud y otros clientes de sincronización mantienen como marcadores de posición: tienen nombre, icono y tamaño, pero ningún byte detrás. Una herramienta que suma tamaños te prometerá cientos de gigabytes que no existen, y borrar un marcador de posición te quita tu única copia sin liberar nada.
Por eso todas las cifras de este artículo son bytes asignados. Los totales salen más pequeños, y son cifras que puedes contrastar con tu propio espacio libre.
Dos maneras de leer 30 GB
La primera lectura se fija en qué son las copias. La parte más grande son 13,06 GB de pesos de modelos de IA, y un mismo archivo de modelo de 2,9 GB estaba en cuatro sitios a la vez: el contenedor de una app, un fixture de pruebas, una copia de seguridad y una carpeta de soporte. Después vienen otros datos de apps, archivos de compilación y, por último, archivos multimedia y documentos.
La segunda se fija en dónde están, y fue la que lo decidió todo. 13,51 GB están dentro de contenedores de otras apps. 12,69 GB están dentro de repositorios de código. Menos de un gigabyte está en carpetas donde a nadie le molesta que una herramienta de limpieza proponga borrar algo.
Una herramienta que libera espacio eliminando archivos puede ofrecer honestamente alrededor del 3 % de lo que acaba de encontrar. Nadie quiere un limpiador que proponga borrar cosas dentro del contenedor de otra app, ni en un árbol de código en el que aún está trabajando. Podríamos haber publicado un escáner que muestra 30 GB y actúa sobre 1 GB, como hacen muchas herramientas.
El verbo decide el alcance
APFS puede hacer que dos archivos compartan los mismos bloques. La llamada es clonefile, el Finder la usa cuando duplicas un archivo, y no tarda nada ni ocupa espacio adicional. Los dos archivos se quedan, cada uno con su nombre, su carpeta, sus permisos, sus marcas de tiempo y su contenido. Solo se comparte el almacenamiento que hay debajo.
Con un archivo de 200 MB, las cifras quedan así:
El espacio volvió en el momento en que empezaron a compartir bloques, y ninguno de los dos archivos lo notó.
Como el verbo no conlleva ningún riesgo, el alcance puede ser toda la carpeta de inicio y no solo el puñado de carpetas donde cabe proponer un borrado. La red acaba siendo unas treinta veces más amplia que la de un buscador de duplicados, y la única razón es que el verbo dejó de ser borrar.
Hay una regla que se cumple siempre: el hash nunca decide una escritura. Solo acota los candidatos. Antes de escribir nada, los dos archivos se comparan byte a byte, así que una colisión de hash no puede hacer que nadie pierda sus datos.
Un análisis de toda la carpeta de inicio, 870.229 archivos, tarda 7,3 segundos la primera vez y 5,4 las siguientes (en la primera versión eran 59,8), así que puede ejecutarse cada vez que haces clic, sin tener que programarlo.
Una promesa que puedes comprobar
Las herramientas de almacenamiento están llenas de cifras que nadie puede verificar. Esta viene con comprobante, y hicimos que ese comprobante se pudiera verificar con tres mecanismos independientes entre sí.
La promesa es lo que sumaban las filas antes de la ejecución. El comprobante se mide después, volviendo a leer los bytes exclusivos de cada archivo sustituido. df es la contabilidad del propio volumen y no sabe nada de todo esto. Cuando los tres no coinciden, es que la promesa estaba mal, y preferimos descubrirlo aquí a que alguien lo descubra en su propio disco.
Después comprobamos los propios archivos, comparándolos con registros que ya existían antes de la ejecución y que nosotros nunca escribimos:
- 3.478 copias controladas por Git siguen dando el mismo hash que el blob que registró Git. Cero diferencias.
- 1.877 PNG superan las sumas de comprobación de sus fragmentos internos, 77 imágenes de disco superan la suma de comprobación de su propia bifurcación de datos, 11 bases de datos SQLite superan una comprobación de integridad, y todas las entradas ZIP y gzip superan su CRC.
- 164 firmas Mach-O son válidas, 54 paquetes de apps firmados conservan su resultado de
codesigny el hash de su directorio de código, y 20 paquetes de símbolos de depuración conservan sus UUID. - Dos copias de una app notarizada siguen pasando Gatekeeper con el mismo resultado que antes.
Un archivo que comparte sus bloques sigue siendo el mismo archivo. Esas comprobaciones son las que nos permiten afirmarlo.
Dos cosas que la primera ejecución real hizo mal
Cambió dos cosas que no debía: la fecha en que se añadió cada archivo, tal como la muestra el Finder, y, en 301 de las 8.414 copias de la primera ejecución sobre toda la carpeta de inicio, el registro de la app que descargó el archivo. Ahora Mint compara los atributos de cada archivo antes y después, para que lo único que cambie sea el espacio que ocupa.
Lo que medimos y no construimos
macOS tiene un indicador de compresión transparente, y en esta máquina las cuentas eran tentadoras. Con muestras de todo el disco, la compresión habría devuelto 57,5 GB, más que compartir bloques, y todos los archivos habrían seguido siendo plenamente utilizables. Apple la usa en la mayor parte del sistema.
Si usas agentes de programación, tu Mac es así
Así es una máquina que ejecuta agentes: 13,06 GB de pesos de modelos duplicados. Sin agentes, rara vez se ve ese perfil.
Los agentes copian cosas por diseño. Un modelo se descarga una vez para la app y otra dentro de su contenedor de sandbox. Cada worktree que crea un agente lleva sus propios archivos de compilación. Un fixture de pruebas guarda una copia del archivo con el que se prueba. Nada de esto es un error, ni algo que quieras borrar a mano, porque no siempre puedes saber de qué copia depende cada cosa.
Compartir bloques encaja bien en este caso. No necesitas saber qué copia importa, porque todas siguen funcionando, y no tienes que cerrar el agente ni decidir nada. En la primera ejecución sobre toda la carpeta de inicio: 3.262 grupos, 8.414 copias, 28 segundos, ningún rechazo, 17,21 GB recuperados. Un análisis posterior encontró 37 MB pendientes: archivos que las apps abiertas en ese momento tenían en uso.
Lo que aprendimos
El total nunca fue la cifra útil. Lo útil fue el desglose por ubicación, porque mostró que lo que un escáner puede detectar y aquello sobre lo que un limpiador puede actuar eran dos cifras distintas, y una era treinta veces la otra. Todo lo que vino después salió de cambiar el verbo, no de pedir un permiso más amplio.
Una herramienta que promete espacio también debería poder demostrarlo después. En una ejecución que tocó 8.414 archivos reales de una persona, la promesa, el comprobante y el volumen coincidieron hasta el último byte.
Decide si las copias deben quedarse
Usa la guía de archivos duplicados para distinguir los archivos que puedes eliminar de las copias que deben seguir funcionando donde están. Si los Datos del sistema ocupan mucho, empieza por el diagnóstico de los Datos del sistema: el total de la categoría no basta para saber qué borrar.