11 votos

Eliminar una carpeta con muchos archivos

No estoy seguro de cómo hacer esta pregunta correctamente, pero voy a intentarlo.

Estoy en Mojave 10.14.

Encontré un directorio en mi papelera que es extremadamente lento para eliminar. Cuando intento ingresar al directorio, Finder muestra un icono giratorio en la parte inferior y no muestra los archivos en él. He esperado más de 10 minutos.

Cuando intento usar el comando "ls" en la terminal, también tarda más de 10 minutos y no muestra nada.

Cuando intento vaciar la papelera, es EXTREMADAMENTE lento. El número de archivos eliminados aumenta 1 por segundo (casi). He esperado más de 30 minutos y aún no había terminado.

¿Cómo puedo diagnosticar este problema y encontrar una solución?

Actualización 1: El sistema de archivos es APFS y el directorio tiene más de 12,000,000 archivos json pequeños. Actualización 2: Finalmente conté el número de archivos y el tamaño total del directorio. El directorio tiene 22,203,359 archivos y 27.59GB.

0 votos

Los comentarios no son para discusiones extendidas; esta conversación ha sido trasladada al chat.

0 votos

Pero ¿el grupo está hablando sobre el tema para resolver el problema?

-2voto

Adi Puntos 1105

Incluso las herramientas "simples" como rm en realidad son varias miles de líneas de código y están llenas de características complicadas que las ralentizan. Además, casi todos los sistemas de archivos no están diseñados para contener grandes cantidades de archivos en un solo directorio (10,000 es un límite superior razonable o 1,000 si se utiliza un navegador de archivos GUI).

Aquí hay un script simple que utiliza APIs de bajo nivel de UNIX (unlink() y rmdir()) para eliminar cada elemento individual en el directorio, utilizando la API nftw() para escanear el directorio.

Simplemente guárdalo como un archivo de texto, hazlo ejecutable y ejecútalo. Esperaría que sea muy rápido incluso con 22 millones de archivos.

#!/usr/bin/swift

import Foundation

let path = "/Ruta/Hacia/Carpeta"

nftw(path, { child, _, type, _ in
    if (type == FTW_F) { // archivo
      unlink(child)
    } else if (type == FTW_DP) { // directorio "donde hemos visitado hijos"
      rmdir(child)
    } else if (type == FTW_SL || type == FTW_SLN) { // enlace simbólico
      unlink(child)
    } else { // cualquier otra cosa, asumir algún problema de permiso u similar
      print("No se puede borrar \(String(cString: child!))")
      return 1 // error
    }
    return 0 // sin error
  },
  42, // ¿cuántos descriptores de archivo deberíamos usar?
  FTW_PHYS | FTW_DEPTH // no seguir enlaces simbólicos, hacer un escaneo "en profundidad primero" (los archivos se proporcionan antes que su directorio padre)
)

0 votos

¿Tienes una referencia para la afirmación sobre el número de archivos por directorio?

0 votos

No sería tan duro con este cartel, asumiendo que el código funciona. Aunque, las estimaciones del cartel son de la época de DOS.

0 votos

@nohillside No hay un límite estricto, más bien el rendimiento empeora gradualmente cuanto más tienes y alrededor de 10,000 es cuando es probable que te encuentres con problemas dependiendo del software que estás utilizando. En cuanto a cómo llegué a ese número, es una combinación de experiencia en el mundo real e investigación a lo largo de décadas gestionando grandes conjuntos de datos. También, obviamente, depende de la velocidad de tu sistema de almacenamiento. Un SSD PCIe de grado empresarial manejará mejor números grandes que una tarjeta Micro SD.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X