Eliminar gran cantidad de archivos en Windows es lento

34

Tengo una caja de Windows XP con un disco NTFS y la eliminación de grandes cantidades de archivos es extremadamente lenta. Si selecciono una carpeta que contiene una gran cantidad de archivos en un árbol de carpetas y la elimino (usando shift-del para guardar la papelera de reciclaje), lleva tiempo que parece ser directamente proporcional a la cantidad de archivos dentro de la carpeta antes de que incluso aparece el cuadro de confirmación. Luego toma más tiempo borrar cada archivo en la carpeta.

¿Hay alguna forma de eliminar una carpeta en Windows y no tomar el tiempo proporcionalmente a la cantidad de archivos que contiene?

Sindri Traustason
fuente

Respuestas:

60

¿Hay alguna forma de eliminar una carpeta en Windows y no tomar el tiempo proporcionalmente a la cantidad de archivos que contiene?

No lo creo, pero algunos métodos son claramente mucho más rápidos que otros.

La peor forma es enviar a la Papelera de reciclaje: aún necesita eliminarlos. El siguiente peor es shift + delete con el Explorador de Windows: desperdicia mucho tiempo revisando el contenido antes de comenzar a eliminar cualquier cosa.

Lo mejor es usarlo rmdir /s/q foldernamedesde la línea de comandos. del /f/s/q foldernametambién es bueno, pero deja atrás la estructura del directorio.

Lo mejor que he encontrado es un archivo por lotes de dos líneas con un primer paso para eliminar archivos y salidas a nul para evitar la sobrecarga de escritura en la pantalla para cada archivo único. Una segunda pasada limpia la estructura de directorio restante:

del /f/s/q foldername > nul
rmdir /s/q foldername

Esto es casi tres veces más rápido que un único rmdir, basado en pruebas de tiempo con un disco encriptado de Windows XP, eliminando ~ 30GB / 1,000,000 de archivos / 15,000 carpetas: rmdirtoma ~ 2.5 horas, del+rmdirtoma ~ 53 minutos. Más información aquí .

Esta es una tarea normal para mí, por lo que generalmente muevo las cosas que necesito eliminar a C: \ stufftodelete y tengo esos del+rmdircomandos en un archivo por lotes deletestuff.bat. Está programado para ejecutarse por la noche, pero a veces necesito ejecutarlo durante el día, así que cuanto más rápido mejor.

Hugo
fuente
Votación a favor para incluir> nul
Nuktu
1
Windows me haría esperar para escanear miles de archivos desde una copia de seguridad de un SDK antiguo. Iba a tomar al menos una hora, esto puede tomar 10 minutos en mi caso. Lo puse en un archivo bat para su uso repetido: gist.github.com/DavidEdwards/61d4d336232284b33b237b04da5bfe10
Knossos
Vea también la misma respuesta con más información en superuser.com/questions/19762/mass-deleting-files-in-windows
Warlike Chimpanzee
1

¿Hay alguna forma de eliminar una carpeta en Windows y no tomar el tiempo proporcionalmente a la cantidad de archivos que contiene?

Bueno, sí, formatea la partición. Estoy un poco sorprendido de que nadie sugirió eso en los últimos 9 años.

Es bastante radical, pero si anticipa hacer esto con frecuencia para una carpeta específica, puede valer la pena crear una partición separada para ella.


Si eso es demasiado radical, las otras respuestas son su única esperanza. Hay una buena explicación de por qué en serverfault . Es para sistemas de archivos Linux y XFS, pero aquí se aplica la misma lógica. No puede mejorar mucho las funciones integradas del sistema operativo.

Sin embargo, si conoce las rutas a todos los archivos que desea eliminar, puede guardar en las llamadas que enumeran el contenido del directorio y eliminar llamadas directamente, ahorrando algo de sobrecarga. Sin embargo, sigue siendo proporcional al número de archivos.

Personalmente, me gusta un informe de progreso para asegurarme de que el programa no murió. Entonces me gusta eliminar cosas a través de Python. Por ejemplo, si todos los archivos están en un directorio sin subdirectorios:

import tqdm
import sys
import os

location = sys.argv[1]
directory = os.fsencode(location)

with os.scandir(directory) as it:
    for dir_entry in tqdm.tqdm(it):
        try:
            os.remove(dir_entry.path)
        except OSError:
            pass  # was not a file

Esto elimina alrededor de 250 archivos / s en mi SEAGATE ST3250620NS de 12 años. Supongo que será mucho más rápido en tu disco.

Sin embargo, en este punto es solo micro-optimización, por lo que no servirá de mucho a menos que tenga millones de archivos en un directorio. (como yo, jajaja, qué he hecho D :)

FirefoxMetzger
fuente
0

Instalar gnutools for windowsy ejecutar:

find YOURFOLDER -type d -maxdepth 3 | xargs rm -Rf
inútil
fuente
0

¡Asegúrese de no hacer una copia de seguridad de los archivos en la nube e intentar eliminarlos al mismo tiempo!

Con muchas soluciones de copia de seguridad en la nube, los archivos se bloquearán mientras se realizan copias de seguridad y luego tendrá que esperar a que se realicen copias de seguridad.

Si tiene este problema con decir un directorio temporal (o algo que no necesita copia de seguridad) asegúrese de que el directorio temporal no esté seleccionado en su conjunto de copia de seguridad.

Simon
fuente
0

Descubrí que las carpetas con varias capas de directorios tienden a ralentizar realmente la capacidad de Windows de eliminarlas rápidamente. Estaba trabajando en un proyecto donde se necesitaron 5 niveles para llegar a la carpeta node_modules, que siempre es una bestia para eliminar, incluso con

del /f/s/q foldername > nul
rmdir /s/q foldername

Lo que termino haciendo en esta situación es navegar hacia la carpeta node_modules o cualquier directorio que tenga los niveles más profundos y simplemente comenzar a seleccionar y eliminar aproximadamente una docena de directorios a la vez. Si obtengo varias eliminaciones, esto obliga a la Papelera de reciclaje a trabajar en procesos paralelos en lugar del hilo único que creo que usa, acelera drásticamente el proceso.

Una vez que mi directorio más profundo está vacío, subo algunos niveles y hago lo mismo. Esto ha reducido las eliminaciones que me han llevado más de una hora a solo unos minutos.

Es un proceso muy manual y probablemente podría ser un guión exitoso, pero es lo que funcionó para mí.

TabsNotSpaces
fuente
0

Utilicé la respuesta original de Hugo para crear un archivo .bat que utilizo al eliminar proyectos de NPM. Agregué una variable de ruta y solo tengo que copiar y pegar la ruta una vez. Haga doble clic en el archivo .bat y hará todo el trabajo, sin necesidad de escribir todo.

set path="FOLDER_PATH"
del /f/s/q %path% > nul
rmdir /s/q %path%

Ejemplo de uso:

set path="C:\Projects\My React Project"
del /f/s/q %path% > nul
rmdir /s/q %path%
Martín pescador
fuente
-2

intentaste usar el símbolo del sistema

rmdir /s /q foldername

Todas las operaciones de archivos grandes en las GUI son lentas, principalmente porque la retroalimentación visual (barra de progreso) se debe volver a pintar muchas veces

nEJC
fuente
55
Esto no tiene sentido. La operación puede ser lenta porque la GUI necesita contar todos los archivos para estimar el tiempo requerido, pero no debido al repintado.
Bender
mal ... Trabajo constantemente con carpetas grandes (principalmente servidor win2k), y uso TotalCommander para mover / copiar / eliminar cosas. Me di cuenta de que si minimizo TC o pongo otra ventana de aplicación encima de TC, se hace al menos un 50% más rápido. TC todavía está repintando cosas visuales, pero todo se ignora en la composición ...
nEJC el
66
¿Su computadora es tan lenta que las operaciones de la GUI afectan el rendimiento de E / S del disco? ¿O TotalCommander está increíblemente mal codificado? El disco es cientos o miles de veces más lento que la CPU, la RAM y la tarjeta de video. Si los gráficos están disminuyendo la velocidad de escritura de su disco, tiene problemas importantes.
Mr. Shiny and New 安 宇
1
La pregunta tenía "no tener el tiempo tomado proporcionalmente al número de archivos" por una razón. No estoy buscando un 50% más rápido.
Sindri Traustason 01 de
@Sindri Si lo hace de la manera del símbolo del sistema, casi no debería haber demora antes de que el sistema comience a hacer su magia. Hasta donde yo entiendo, este preprocesamiento es donde está su problema.
nEJC