Use rmdir para eliminar muchas carpetas vacías dentro de una carpeta


1

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.


¿Cuántos directorios de profundidad va esto?
UtahJarhead

Relacionado con la pregunta de UtahJarhead, si la estructura del directorio termina siendo demasiado profunda, e incluso si no lo hace, pero se sentiría más cómodo dividiendo el trabajo en pedazos, podría comenzar su comando rmdir a la mitad, o dos tercios en el camino Su árbol de directorios.
panhandel

Gracias por las respuestas. Actualicé la pregunta con la estructura de carpetas.
Titi

Respuestas:


0

Sin saber cuántos directorios tiene, es difícil predecir cómo se comportará el enfoque, pero puedo decirle esto:

find . -maxdepth 1 -type d -empty -delete

Es una muy mala idea. find es insoportablemente lento cuando se trata de eliminar cosas. Las veces que lo comparé, el -deletecambio fue de 40 a 50 veces más lento que el enfoque óptimo.

Igualmente,

rmdir --ignore-fail-on-non-empty /path/to/huge/folder/*

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:

find . -maxdepth 1 -type d -empty -exec rmdir {} +

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.


Gracias por el útil comando. Actualmente lo estoy ejecutando y está eliminando en promedio unas 10k carpetas vacías cada 10 minutos. Afortunadamente, calculé mal la cantidad de directorios vacíos, y solo había un poco más de 1 millón de carpetas en esa carpeta principal (no 10 millones). Ahora solo tengo que jugar el juego de la espera ...
Titi
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.