web-dev-qa-db-fra.com

Suppression en masse de fichiers sous Windows

J'ai un répertoire qui contient environ 3 millions de fichiers dans certains sous-répertoires sur un serveur Windows 2008. Supprimer manuellement les fichiers via SHIFT + DEL dans le répertoire racine prend beaucoup de temps. Existe-t-il un autre moyen d'effectuer la suppression de manière plus rapide ?

138
aaginor

Je dois régulièrement supprimer de nombreux fichiers et répertoires d'un lecteur crypté WinXP, généralement environ 22 Go sur 500 000 fichiers dans 45 000 dossiers.

Supprimer avec Windows Explorer est une foutaise, car il perd beaucoup de temps à énumérer les fichiers. En général, je déplace les éléments à supprimer dans C:\stufftodelete et j’ai créé un fichier de commandes deletestuff.bat dans rmdir /s/q C:\stufftodelete. Ceci est programmé pour fonctionner la nuit, mais parfois je dois le faire pendant le jour afin que le plus vite soit le mieux.

Voici les résultats d'un test Quick Time sur un petit échantillon de 5,85 Mo de 960 fichiers dans 303 dossiers. J'ai exécuté la méthode 1 suivie de la méthode 2, puis j'ai réinitialisé les répertoires de test.

La méthode 1 supprime les fichiers et la structure de répertoires en un seul passage:

rmdir /s/q foldername

La méthode 2 utilise une première passe pour supprimer les fichiers et les sorties à zéro afin d'éviter les frais d'écriture à l'écran pour chaque fichier unique. Une seconde passe nettoie ensuite la structure de répertoire restante:

del /f/s/q foldername > nul
rmdir /s/q foldername
  • Méthode 1: 17,5s, 14,9s, 13,9s, 14,8s, 13,8s: moyenne 14,98 secondes
  • Méthode 2: 14.3s, 12.1s, 11.7s, 14.2s, 11.8s: moyenne 12.82 secondes

Voici les résultats d'un autre test utilisant 404 Mo de 19 521 fichiers dans 3 243 dossiers:

  • Méthode 1: 2 minutes 20 secondes
  • Méthode 2: 2 minutes 33 secondes

Donc, il n'y a pas grand chose dedans, probablement trop près pour juger d'un seul test.


Edit: j'ai retesté avec beaucoup plus de données, c'est un cas typique pour moi: 28,3 Go de 1 159 211 fichiers dans 146 918 dossiers:

  • Méthode 1: 2h 15m, 2h 34m: moyenne: 2 heures 25 minutes
  • Méthode 2: 49m, 57m: moyenne: 53 minutes

Wow, la méthode 2 est presque trois fois plus rapide que la méthode 1! Je mettrai à jour mon fichier deletestuff.bat!

177
Hugo

Si vous devez supprimer régulièrement des arborescences de répertoires volumineuses, envisagez de stocker la racine de cette arborescence sur une partition distincte, puis formatez-la simplement lorsque vous devez tout supprimer. Si vous avez besoin d'automatiser cela, vous pouvez utiliser cette commande DOS:

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

où Z: est votre partition 'volatile'. Remarque: la partition ne doit pas avoir d'étiquette. J'ai blogué à ce sujet ici .

18
Mr. Bungle

Dans l'invite de commande (Démarrer -> Exécuter -> cmd):

del /f /s /q foldername 
9
lmsasu

En plus de copier/déplacer des fichiers très rapidement (à l'aide de sa propre API), TeraCopy peut supprimer des fichiers et c'est très rapide aussi. Depuis que j'ai découvert TeraCopy, je n'utilise pas d'ordinateur sans qu'il soit installé (si je vais copier/déplacer/supprimer).

Le même programme d'installation installe l'édition x64 mais pour l'utiliser, vous devez le forcer manuellement.

La version bêta que je recommande par rapport aux versions stables: http://blog.codesector.com/2010/09/22/teracopy-2-2-beta-3/

6
rautamiekka

J'ai fait un fichier chauve-souris qui fait la même chose.

@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

il fait le travail en deux temps, un essaie de supprimer les fichiers. Et le second est d'essayer de s'approprier les fichiers. y devrait être modifié en fonction de votre section locale (signifie oui en anglais). En cas d'échec de la tâche (par exemple, si échec en raison d'une autorisation), vous devez l'exécuter à nouveau. Cependant, le second tour ne tentera pas de supprimer les fichiers supprimés lors du premier tour, cela pourrait donc être assez rapide.


Comment l'utiliser. Enregistrez sous delfolder.bat dans un chemin d’accès (par exemple, c:\windows), puis exécutez-le sous

 delfolder "foldername"   

où nomdossier est le nom du dossier

Lors de mon test, la suppression de 123 000 fichiers a pris 3 minutes (7200 tours par minute). YAY!

6
magallanes

Utilisez la commande rd/s à partir de la commande Invite.

3
JP Alioto

L'utilisation du code ci-dessous fonctionne généralement bien pour moi.

mkdir empty_dir
robocopy empty_dir dir_to_wipe /mir /r:0 /w:0 /e
rmdir empty_dir dir_to_wipe
3
Benoit

La meilleure solution pratique consiste probablement à déplacer le dossier quelque part (par exemple, la corbeille), puis à le supprimer. Ça va prendre des siècles, mais au moins, ça sera hors du chemin.

Je suis à peu près sûr que le temps nécessaire pour supprimer tous ces fichiers est une exigence inhérente à la tâche, et non une inefficacité dans la mise en œuvre de la suppression.

2
Ryan Thompson

Installez Cygwin et utilisez rm -r . Mais cela risque d'être excessif.

1
CarlF

La génération de noms de fichiers courts est-elle activée? Si oui, en avez-vous vraiment besoin? La suppression d'un fichier n'est qu'une opération de métadonnées. Donc, si vous avez deux fois le nombre de noms à supprimer, la quantité de travail est considérablement plus élevée.

1
MSalters

Avez-vous essayé l'une de ces deux applications?

Assurez-vous de définir le nombre de remplacements sur 0 si vous souhaitez obtenir les performances les plus rapides. Pour ce faire, cliquez sur Options, puis modifiez la valeur au bas de la boîte de dialogue.

Entrez le chemin à supprimer dans le champ Source, puis cliquez sur Supprimer.

Ces applications ne mettent pas les fichiers dans la corbeille. Utilisez avec soin.

0
Stephen Kellett

Ceci est fourni pour compléter et augmenter les étapes effectuées dans les réponses mentionnées précédemment.

Les deux méthodes ci-dessus semblent assez efficaces, mais il serait difficile de déterminer la performance si elles ne sont pas comparées à des conditions identiques:

  • Disque dur physique et modèle
    • De préférence, ATTO/Crystal Disk comparé avant de cloner les données sur ceux-ci
  • Même partition/volume et géométrie de la partition
    • Pour ce faire, vous devez défragmenter la partition/les dossiers exemple et les cloner exactement car ils sont exactement les mêmes types de disques durs (de l'étape précédente).
  • Exécutez ensuite les configurations via le fichier de commandes et utilisez l'applet de commande Powershell pour vous connecter et mesurer leurs performances.

    • Idéalement, ajoutez des mécanismes pour éviter les biais de cache dus à la récurrence d'activités similaires.
  • Vous trouverez ci-dessous des exemples de dossiers (nommés taille totale) sur lesquels j’ai expérimenté, mais n’ont pas pu obtenir de résultats/performances concluants.

r.bat

rmdir /s/q 3.2G

rd.bat

del /f/s/q 3.3G > nul
rmdir /s/q 3.3G
  • J'aurais posté les fichiers journaux de sortie, mais je crois que la variance est énorme en raison de la taille et de la distribution des fichiers de dossiers, etc.

Powershell:

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
0
Alex S

La réponse de Hugo est la plus rapide, mais elle ne supprime pas les fichiers cachés ou système lors du premier passage. Si vous souhaitez une solution plus complète, utilisez le paramètre/a:

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

À propos du fichier BAT par Magallanes , soyez très prudent avec takeown et icacls, car les liens physiques partagent les mêmes autorisations et les mêmes propriétaires. Par conséquent, s'il y a liens non saturés dans le dossier que vous souhaitez supprimer, utilisez Takeown et icacls. changera les permissions et les propriétaires des fichiers en dehors du dossier.

En utilisant l’outil ln.exe , vous pouvez répertorier tous les fichiers liés durement dans le dossier et savoir s’ils le sont, et en savoir plus, sur les fichiers extérieurs au dossier (liens durs non saturés):

ln.exe --enum foldername > HardlinksList.txt
0
liamZ