Eliminación masiva de archivos en Windows

141

Tengo un directorio que contiene ~ 3 millones de archivos en ciertos subdirectorios en un servidor Windows 2008. La eliminación manual de los archivos a través de SHIFT + DEL en el directorio raíz lleva años. ¿Hay alguna otra forma de hacer la eliminación de una manera más rápida ?

Cfinley
fuente
1
También preguntado aquí en Stack Overflow: stackoverflow.com/questions/186737/…
Hugo
66
¿Cómo podría dirigir el imán solo a algunos subdirectorios?
Jaime Hablutzel
77
@Jaime Con una mano firme, como un programador de verdad ... ;-) xkcd.com/378
Legionair
¿Qué pasa si es una unidad SSD?
Benjamin Weiss
Respuesta para powershell: stackoverflow.com/questions/1752677/…
Warlike Chimpanzee

Respuestas:

179

ADVERTENCIA: si tiene enlaces simbólicos a directorios del, eliminará los directorios reales y no los enlaces simbólicos. Tenga mucho cuidado con esto y no ejecute estos comandos a menos que sepa que no hay enlaces simbólicos dentro del directorio de destino.


Regularmente necesito eliminar muchos archivos y directorios de una unidad cifrada WinXP, generalmente alrededor de 22 GB de 500,000 archivos en 45,000 carpetas.

Eliminar con el Explorador de Windows es una basura porque desperdicia mucho tiempo enumerando los archivos. Por lo general, muevo las cosas que necesito eliminar a C: \ stufftodelete y tengo un archivo por lotes deletestuff.bat rmdir /s/q C:\stufftodelete. Está programado para ejecutarse por la noche, pero a veces necesito ejecutarlo durante el día, así que cuanto más rápido mejor.

Aquí están los resultados de una prueba rápida de una pequeña muestra de 5.85 MB de 960 archivos en 303 carpetas. Ejecuté el método 1 seguido del método 2, luego reinicié los directorios de prueba.

El método 1 elimina los archivos y la estructura de directorios de una sola vez:

rmdir /s/q foldername

El Método 2 tiene un primer paso para eliminar archivos y salidas a nul para evitar la sobrecarga de escritura en la pantalla para cada archivo de inicio. Una segunda pasada limpia la estructura de directorios restante:

del /f/s/q foldername > nul
rmdir /s/q foldername
  • Método 1: 17.5s, 14.9s, 13.9s, 14.8s, 13.8s: promedio de 14.98 segundos
  • Método 2: 14.3s, 12.1s, 11.7s, 14.2s, 11.8s: promedio de 12.82 segundos

Aquí están los resultados de otra prueba usando 404 MB de 19,521 archivos en 3,243 carpetas:

  • Método 1: 2 minutos 20 segundos
  • Método 2: 2 minutos 33 segundos

Por lo tanto, no hay mucho, probablemente demasiado cerca para juzgar en una sola prueba.


Editar: he vuelto a probar con muchos más datos, este es un caso típico para mí: 28,3 GB de 1.159.211 archivos en 146.918 carpetas:

  • Método 1: 2h 15m, 2h 34m: promedio: 2 horas 25 minutos
  • Método 2: 49m, 57m: promedio: 53 minutos

¡Guau, el método 2 es casi tres veces más rápido que el método 1! ¡Actualizaré mi deletestuff.bat!

Hugo
fuente
RD / S / Q funciona muy bien si especifica una ruta absoluta pero no lo hace cuando trabaja con rutas relativas. ¿Hay alguna solución?
Michael S.
1
@Hugo: Hugo, una pregunta: en las pruebas cronometradas anteriores, para uno o ambos métodos, ¿contó los archivos inmediatamente antes de ejecutar el método? Estoy preguntando porque el contenido de la carpeta ya puede estar en la caché de archivos del sistema operativo. ¡Gracias!
William C
@WilliamC: No recuerdo exactamente, pero para las eliminaciones repetidas con el mismo contenido, habré contado inmediatamente antes de solo una eliminación, y no lo habré repetido para las otras eliminaciones (como ya sabía los números).
Hugo
1
Tanto rmdir como del fail cuando hay nombres de ruta de más de 256 caracteres involucrados.
Nicolai Ehemann
1
ADVERTENCIA: si tiene enlaces simbólicos a directorios del, eliminará los directorios reales y no los enlaces simbólicos. Tenga mucho cuidado con esto y no ejecute estos comandos a menos que sepa que no hay enlaces simbólicos dentro del directorio de destino.
user0103
18

Si tiene que eliminar grandes árboles de directorios regularmente, considere almacenar la raíz de ese árbol de directorios en una partición separada, luego simplemente formatee rápidamente cuando necesite eliminar todo. Si necesita automatizar esto, puede usar este comando de DOS:

echo Y | format Z: /FS:NTFS /X /Q

donde Z: es su partición 'volátil'. Nota: la partición no debe tener etiqueta. Blogueé sobre esto aquí .

Señor selva
fuente
Y use un enlace rígido para crear una conexión entre el disco y el directorio donde se almacenan los archivos si se necesita la ruta exacta del directorio.
Nime Cloud
1
@NimeCloud: los enlaces duros no pueden cruzar sistemas de archivos o directorios de enlaces.
Grawity
55
Sin embargo, los enlaces simbólicos pueden cruzar sistemas de archivos y directorios de enlaces, por lo que pueden ser apropiados aquí. Vea el comando mklink (Vista y posterior; de lo contrario, use la unión de Mark Russinovich / SysInternals.)
Robert Calhoun
9

En el símbolo del sistema (Inicio -> Ejecutar -> cmd):

del /f /s /q foldername 
lmsasu
fuente
Esto es genial porque enumera lo que está eliminando ... pero es lo mismo que rd en términos de velocidad.
bobobobo
1
Oh woah woah woah No tan bueno como pensaba. Elimina los archivos rápidamente pero deja el árbol de directorios intacto.
bobobobo
1
Lo que podría agregar toma bastante tiempo para limpiar usando rd.
bobobobo
3
@bobobobo Hice algunas pruebas con ~ 30GB / 1,000,000 de archivos / 15,000 carpetas y del + rd es casi tres veces más rápido que solo rd: superuser.com/questions/19762/mass-deleting-files-in-windows/…
Hugo
1
Esto fallará si el nombre de ruta es más largo que 256 caracteres.
Nicolai Ehemann
7

Además de copiar / mover archivos muy rápido (usando su propia API), TeraCopy puede eliminar archivos y también es muy rápido. Desde que descubrí TeraCopy no uso una computadora sin ella instalada (si voy a copiar / mover / eliminar).

El mismo instalador instala la edición x64, pero para usarlo debe forzarlo manualmente.

La versión beta que recomiendo sobre las versiones estables: http://blog.codesector.com/2010/09/22/teracopy-2-2-beta-3/

rautamiekka
fuente
¿Alguna vez ha hecho o visto algunas comparaciones de tiempo similar de TeraCopy vs rmdir o del o del + rmdir?
Hugo
1
@Hugo: pregunta estúpida. ¡No recomendaría TeraCopy si no fuera visible a simple vista, es más rápido!
rautamiekka
55
Entonces, ¿estima que es un 10% más rápido? ¿Dos veces más rápido? ¿Diez veces más rápido? ¿Un millón de veces más rápido? Sería genial si pudiera compararlo con rmdir con dos conjuntos de prueba grandes e idénticos.
Hugo
1
¡Gracias! He estado usando TeraCopy durante años, pero nunca supe de la función de eliminación masiva. ¡Y tienes razón, es mucho, MUCHO más rápido!
AzDayton
1
@Amalgovinus No lo haces. Puede abrir el programa y agregar archivos / carpetas mediante arrastrar y soltar o hacer clic con el botón derecho, o hacer clic con el botón derecho en sus archivos / carpetas en el Explorador / en el escritorio. Una vez que haya terminado de caminar, simplemente haga clic en 'Eliminar' y 'Mover a la papelera de reciclaje' si lo desea, pero estoy a favor de 'Eliminar del disco'. Sin embargo, deberá iniciar TeraCopy como administrador para que aparezca en el escritorio / Explorer con el botón derecho si no se hace de manera predeterminada.
rautamiekka
6

Hice un archivo bat que hace lo mismo.

@echo off
echo --------------------WARNING--------------------
echo folder "%~1" will be deleted
echo --------------------WARNING--------------------
pause
echo Deleting folder: "%~1".
time /T
del /f/s/q "%~1" >nul
rmdir /s/q "%~1" >nul
echo Done.
time /T
echo --- Taking ownership.
takeown /f "%~1" /r /d y >nul
icacls "%~1" /reset /t >nul
icacls "%~1" /setowner "%username%" /t >nul
echo Done all.
time /T

hace el trabajo en dos pasos, uno, intenta eliminar los archivos. Y el segundo es tratar de apropiarse de los archivos. y debe cambiarse de acuerdo con su local (significa sí en inglés). Si falla la tarea (por ejemplo, si falla debido al permiso), debe ejecutarla nuevamente. Sin embargo, la segunda ronda no intentará eliminar los archivos eliminados en la primera ronda, por lo que podría ser bastante rápido.


Cómo usarlo. Guardar como delfolder.bat en una ruta de ruta (por ejemplo c: \ windows), luego ejecútelo como

 delfolder "foldername"   

donde foldername es el nombre de la carpeta

En mi prueba, eliminar 123'000 archivos tomó 3 minutos (sata 7200rpm). ¡HURRA!

magallanes
fuente
1
Por lo general, no debe usar %1en un script, pero "%~1". De esta manera, si el argumento se ha pasado con comillas, se quita y vuelve a cotizar. Si no se ha pasado con comillas, se cita.
Benoit el
4

Usar el siguiente código generalmente funciona bien para mí.

mkdir empty_dir
robocopy empty_dir dir_to_wipe /mir /r:0 /w:0 /e
rmdir empty_dir dir_to_wipe
Benoit
fuente
Agregue un `> nul` al final de esa llamada robocopy para que no tenga que verlo en la pantalla.
JoshDM
Es similar al uso de rsyncen Linux. ¿Incluso aquí es más rápido entonces rmdir?
Hastur
Para su información, esta robocopia es muy diferente de del /f/q/s+ rmdir /s/q. Si su dir_to_wipe tiene basura c:\some_important_dir, terminará perdiendo sus datos.
Pavel P
@Pavel luego usa / XJ para excluir puntos de unión y enlaces simbólicos?
Bernhard
Esto hizo el truco para un directorio de ~ 36GB que tenía cientos de directorios y archivos que tenían> 256 caracteres causando que el "método" del / rmdir fallara miserablemente. ¡Esto tomó segundos, el Explorador de Windows calculaba HORAS!
3

Use el comando rd / s del símbolo del sistema.

JP Alioto
fuente
2
No. Esto es tan lento como eliminarlo del explorador.
bobobobo
Bueno, está bien. Funciona mejor que del / f / s / q, de todos modos.
bobobobo
3
Bueno, esto es MUCHO mejor que usar Explorer para eliminar, en realidad. Continúa eliminar, incluso si una eliminación o dos fallará (donde el explorador ahoga y aborta)
bobobobo
2

La mejor solución práctica es probablemente mover la carpeta fuera del camino en algún lugar (por ejemplo, la Papelera de reciclaje) y luego comenzar a eliminarla. Tomará años, pero al menos estará fuera del camino.

Estoy bastante seguro de que el tiempo requerido para eliminar todos esos archivos es un requisito inherente de la tarea, no una ineficiencia en la implementación de la eliminación.

Ryan Thompson
fuente
1

Instale Cygwin y use rm -r . Pero es probable que sea exagerado.

CarlF
fuente
Eso es exactamente lo mismo que rd /q /s...
Joey
¡Demasiada tarea y velocidad casi equivalente!
adeelx
1
No es peor que las otras respuestas de install-tool-X-and-use-it aquí, y no deberían ser rechazadas si no están siendo.
JdeBP 01 de
2
¿Cygwin es rmrealmente tan rápido como cmd.exe integrado rd? Debido a que la emulación cygwin de la interfaz posix es bastante lenta, ya que requiere hacer un trabajo adicional, eso rmno se agradece.
Jan Hudec
Mientras esperaba que se eliminara una gran colección de archivos, tuve tiempo suficiente para instalar Cygwin e intentarlo rm -rf. Aproximadamente 10 minutos en aborté y volví a del /f/s/qporque bajo Cygwin, el uso del disco era solo del 50%. Debajo del, el uso del disco está vinculado al 100%. Así que me imagino que debe eliminarse más rápido. El uso de la CPU es <1% para ambos métodos. No estoy seguro del número de archivo porque cerré el Windows File Deleter después de que pasó 10 minutos calculando.
Derek Ziemba
1

¿Tiene habilitada la generación de nombres de archivo cortos? Si es así, ¿realmente lo necesitas? Eliminar un archivo es solo una operación de metadatos. Entonces, si tiene el doble de nombres para eliminar, la cantidad de trabajo es significativamente mayor.

MSalters
fuente
0

¿Has probado alguna de estas dos aplicaciones?

Asegúrese de establecer el número de sobrescrituras en 0 si desea un rendimiento más rápido. Haga esto haciendo clic en las opciones y luego cambie el valor en la parte inferior del cuadro de diálogo.

Ingrese la ruta a eliminar en el campo Fuente y luego haga clic en Eliminar.

Estas aplicaciones no colocan los archivos en la papelera de reciclaje. Usar con cuidado.

Stephen Kellett
fuente
0

Esto se proporciona para complementar y aumentar los pasos tomados en las respuestas mencionadas anteriormente.

Los dos métodos anteriores parecen bastante efectivos, pero determinar el rendimiento sería difícil a menos que se comparen con las mismas condiciones:

  • Dispositivo y modelo de disco duro físico
    • Preferiblemente, ATTO / Crystal Disk comparado antes de clonar los datos en ellos
  • Misma partición / ubicación de volumen y geometría
    • La forma de hacerlo sería desfragmentar las particiones / carpetas de muestra y clonarlas exactamente como son 2 exactamente los mismos tipos de discos duros (del paso anterior)
  • Luego ejecute las configuraciones a través de Batch File y use el cmdlet Powershell para registrar y medir su rendimiento.

    • Idealmente, agregue algunos mecanismos para evitar cualquier sesgo de almacenamiento en caché debido a la reciente actividad similar.
  • Las siguientes son algunas carpetas de muestra (nombradas como tamaño total) en las que experimenté pero no pude obtener resultados / resultados concluyentes.

r.bat

rmdir /s/q 3.2G

rd.bat

del /f/s/q 3.3G > nul
rmdir /s/q 3.3G
  • Hubiera publicado los archivos de registro de salida, pero creo que la variación es enorme debido al tamaño y distribución de los archivos de carpetas, etc.

Potencia Shell:

PS S:\T> Measure-Command { S:\T\rd.bat } > rdlog.txt

PS S:\T> Measure-Command { S:\T\r.bat } > rlog.txt

PS S:\T> Measure-Command { S:\T\rd.bat } > rd_1.7G_log.txt

PS S:\T> Measure-Command { S:\T\r.bat } > r_1.8G_log.txt

PS S:\T> Measure-Command { S:\T\r.bat } > r_2.4G_log.txt

PS S:\T> Measure-Command { S:\T\rd.bat } > rd_2.7G_log.txt

PS S:\T> Measure-Command { S:\T\r.bat } > r_3.2G_log.txt

PS S:\T> Measure-Command { S:\T\rd.bat } > rd_3.3G_log.txt
Alex S
fuente
falla con nombres> 256 caracteres
0

La respuesta de Hugo es la más rápida, pero no elimina los archivos ocultos o del sistema en el primer paso, por lo que si desea una solución más completa, use el parámetro / a:

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

Acerca del archivo BAT de Magallanes , tenga mucho cuidado con takeown y icacls, ya que los enlaces duros comparten los mismos permisos y propietarios, por lo que si hay enlaces duros insaturados en la carpeta que desea eliminar, el uso de takeown e icacls cambiará los permisos y los propietarios de archivos externos. la carpeta.

Usando la herramienta ln.exe puede enumerar todos los archivos vinculados dentro de la carpeta y saber si están vinculados a archivos fuera de la carpeta (enlaces rígidos no saturados):

ln.exe --enum foldername > HardlinksList.txt
liamZ
fuente
-1

Eliminar la carpeta es más rápido que eliminar varios archivos.

Entonces, si prefiere usar el mouse en lugar del símbolo del sistema, puede crear un directorio, mover archivos allí y eliminarlo (con Shift + Del como usted dijo).

danijelk
fuente
2
El directorio debe crearse en la misma partición donde residen los archivos. Esto hará que la acción de mover sea instantánea. Si la nueva carpeta y los archivos están en particiones separadas, toda la operación de copia durará mucho.
55
¿De dónde sacas la idea de que eliminar una carpeta es más rápido que eliminar los archivos dentro? Eliminar una carpeta contiene como primer paso para eliminar todos los archivos de esa carpeta, por lo que no puede ser más rápido. Sin embargo, pasar a la papelera de reciclaje es un asunto completamente diferente, pero esa no es la cuestión aquí.
Joey