¿Cómo puedo eliminar rápidamente una carpeta con muchas subcarpetas?

15

Tengo una carpeta con 266778 subcarpetas. ¿Cómo puedo borrarlo?

Yo he tratado

cd ~/.local/share/Trash/
sudo rm -rf *

Pero lleva mucho tiempo. Después de 1 minuto, 25 segundos en tiempo real y 0.072 segundos de tiempo de usuario, solo eliminó 2500 carpetas. De esta manera, tomará más de dos horas eliminar esta carpeta.

¿Hay alguna forma más rápida de eliminar esta carpeta? ¿Por qué hay una diferencia tan grande entre el tiempo del usuario y el tiempo real?

real    1m25.474s
user    0m0.072s
sys     0m28.142s

Yo uso Linux 2.6.32 (Ubuntu 10.04.4 LTS).

Martin Thoma
fuente
Acabo de buscar en Google este problema y parece que algunas personas han descubierto que rsync se puede usar como una herramienta de "eliminación de muchos archivos" de manera bastante eficiente. Si realmente es más rápido depende de usted evaluarlo.
Johan
2
Por lo que vale: el rendimiento al eliminar muchas carpetas / archivos depende en gran medida del sistema de archivos. En mi experiencia, la diferencia al eliminar millones de archivos pequeños en ext3 (lento) frente a XFS (rápido) puede ser horas.
pdo
Si a menudo tiene este caso y puede planificar con anticipación, utilizando un sistema de archivos como btrfs y un subvolumen, puede acelerar las cosas rápidamente simplemente volcando ese subvolumen.
PlasmaHH
Aquí es donde puedes encontrar la respuesta. El perl es el más rápido. unix.stackexchange.com/questions/37329/…
SDsolar

Respuestas:

17

Si su versión de "find" implementa el subcomando -delete, entonces puede intentar

find directory -delete

En este caso:

find ~/.local/share/Trash/ -delete

Algunos comandos, como rm, realizan la mayor parte de su trabajo en el núcleo. En las rutinas del sistema de archivos, para ser exactos. El tiempo dedicado a realizar llamadas al sistema se contabiliza de esa manera, por lo que si bien su comando "rm" se ejecuta durante mucho tiempo, no hace mucho trabajo en tierra de usuario: las llamadas al sistema realizan la mayor parte del trabajo.

Johan
fuente
+1; aunque esto también elimina el directorio principal y sospecho que el OP solo quería eliminar el contenido de la carpeta Papelera, no la carpeta en sí misma
don_crissti
1
@don_crissti: buen comentario. si el OP solo quería eliminar subdirecciones en ~ / .local / share / Trash (y no archivos en el 1er nivel), entonces: find ~/.local/share/Trash/*/ -delete (por supuesto, esto también eliminará archivos (y directorios) en cualquiera de esos Trash / * / subdires también)
Olivier Dulac
2
+1 por explicar el comportamiento extraño detime
Martin Thoma
3
¿Es find directory -deleterealmente más rápido que rm -rf directory? Después de todo, realizan el mismo trabajo, y no hay dos formas de hacerlo.
Gilles 'SO- deja de ser malvado'
1
@Johan find es realmente rápido. ¿Alguna vez tuvo la oportunidad de descubrir la razón?
Harshdeep
20

Depende de tu definición de rápido . Las respuestas que ya se encuentran aquí brindan una buena solución para eliminar realmente los directorios del sistema de archivos, pero si lo que realmente necesita es liberar el nombre del directorio lo más rápido posible, un cambio de nombre en el mismo sistema de archivos es instantáneo:

{ mv directory directory.gone && rm -rf directory.gone; } &

Técnicamente, esto es trampa, ya que no he acelerado la eliminación real, pero prácticamente es muy útil: uso este truco todo el tiempo para no tener que esperar las operaciones de eliminación lentas.

kojiro
fuente
Excelente. ¿Cuál es su caso de uso para hacer esto todo el tiempo? Si lo hace mucho, ¿no existe el peligro de que acumule trabajos, obtenga múltiples 'directorio.gone' y falle? Supongo que usa un sufijo como '$$' o '% (fecha ...)'
smci
1
Si lo necesitara, probablemente podría usar mktemp con argumentos que garanticen que permanezca en el mismo sistema de archivos. Pero no puedo decir que tengo un ejemplo específico en este momento.
kojiro
kojiro sí gracias, mktempes lo que estaba tratando de recordar ...
SMCI
1

rm -rf directoryo, rm -rf *por supuesto, es el método más rápido a menos que su rmimplementación local esté rota.

Usar findno da ventajas.

Si esto es rápido o lento depende principalmente del sistema de archivos y la implementación del sistema operativo. Entonces la pregunta parece ser inapropiada.

UFS y ZFS en Solaris son conocidos por ser muy rápido con este tipo de tareas ya que ambas implementaciones de sistemas de archivos incluyen código de borrado de fondo que hace que el retraso unlink()y rmdir()llamadas para volver rápido, incluso cuando el objeto relacionado tardará más tiempo en total.

Con la eliminación de fondo retrasada en el núcleo, las actualizaciones del directorio también se pueden realizar rápidamente y esto ayuda a acelerar toda la operación.

astuto
fuente
Si bien uno puede ser perdonado por pensar eso, esto en realidad no es cierto, como lo describe esta respuesta .
Hitechcomputergeek
0

Esta es solo una respuesta parcial, arrojando luz sobre los tres valores que devuelve el comando; citado de la página de time(1)manual :

(i) el tiempo real transcurrido entre la invocación y la terminación, (ii) el tiempo de CPU del usuario (la suma de los valores tms_utimey tms_cutimeen a struct tmscomo devuelto por times(2)), y (iii) el tiempo de CPU del sistema (la suma de los valores tms_stimey tms_cstimeen un struct tmssegún lo devuelto por times(2)) ".

schaiba
fuente