Tengo una carpeta que en cualquier momento debería tener menos de 500k carpetas. Estas carpetas se crean dinámicamente, y cuando los archivos (imágenes) dentro de ellos son eliminados por algún script, la carpeta en sí también debe eliminarse. Debido a un error, la eliminación de las carpetas vacías no se realizó, y ahora terminamos con millones de carpetas vacías ...
Así que en este momento tengo alrededor de 500k carpetas con archivos y además millones de carpetas vacías.
Porque hay tantos directorios allí, incluso un simple ls | wc -l lleva horas, así que ni siquiera puedo encontrar el número exacto.
Podría ejecutar un comando de búsqueda: buscar. -maxdepth 1 -type d -empty; y luego pipa con un rmdir; pero nuevamente, el hallazgo lleva años (o incluso usa la opción -delete que encuentra ofertas)
Entonces tuve la idea de usar rmdir --ignore-fail-on-non-empty / path / to / huge / folder / *; pero no estoy seguro de su eficiencia. Básicamente, este comando solo elimina los directorios vacíos en mi carpeta, lo que significa que los que tienen archivos deben ser seguros y no eliminados. Entonces la opción '--no ignorar-fallar-en-no-vacío' ignora los cientos de miles o advertencias para los directorios que en realidad no están vacíos.
Rápidamente he creado alrededor de 100k carpetas vacías en mi local, luego 'toqué' algunos archivos en algunos de ellos y luego usé el comando rmdir. Si bien tomó 2 minutos crear 100k carpetas vacías, tomó 2 segundos (!) Borrar las vacías. Por lo tanto, tengo muchas esperanzas, pero no estoy seguro de cómo manejará unos 10 millones de carpetas ... (Creo que podría usar ionice para evitar que el sistema se bloquee en caso de que realmente tome años)
Si alguien tiene alguna idea / consejo, o se enfrentó a algo como esto antes, ¿podría indicarme la mejor manera de abordar mi problema? O incluso para decirme qué camino es mejor: encontrar o rmdir ...
EDITAR: Olvidé mencionar la estructura de carpetas antes. Las carpetas dentro de la carpeta principal que tienen archivos, no tienen más carpetas en ellas. Las otras carpetas están vacías. Entonces, todos esos millones de carpetas pueden estar vacías o tener archivos en ellas, pero no más carpetas. Básicamente, solo hay un nivel de carpetas en la estructura de árbol.
Respuestas:
Sin saber cuántos directorios tiene, es difícil predecir cómo se comportará el enfoque, pero puedo decirle esto:
Es una muy mala idea. find es insoportablemente lento cuando se trata de eliminar cosas. Las veces que lo comparé, el
-delete
cambio fue de 40 a 50 veces más lento que el enfoque óptimo.Igualmente,
debe ser subóptimo. El shell expandirá el globo a todas las entradas de directorio (archivos y carpetas) y, antes de pasarlas a rmdir , las ordenará alfabéticamente, lo que llevará tiempo y es completamente innecesario.
El enfoque combinado debería ser el mejor:
Tenga en cuenta que el signo más al final evita llamar a rmdir para cada directorio. En su lugar, find reúne tantos nombres de directorio como puede caber en 128 KiB (debido al límite del núcleo para los argumentos de la línea de comandos) y ejecuta rmdir para todos ellos a la vez.
Combinar lo anterior con ionice no podría doler. Si hay "solo" unos pocos millones de directorios, dudo que sea necesario. Pero como no conoce el número exacto, es mejor prevenir que curar.
fuente