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 ?
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
Voici les résultats d'un autre test utilisant 404 Mo de 19 521 fichiers dans 3 243 dossiers:
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:
Wow, la méthode 2 est presque trois fois plus rapide que la méthode 1! Je mettrai à jour mon fichier deletestuff.bat!
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 .
Dans l'invite de commande (Démarrer -> Exécuter -> cmd
):
del /f /s /q foldername
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/
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!
Utilisez la commande rd/s à partir de la commande Invite.
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
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.
Installez Cygwin et utilisez rm -r . Mais cela risque d'être excessif.
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.
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.
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:
Exécutez ensuite les configurations via le fichier de commandes et utilisez l'applet de commande Powershell pour vous connecter et mesurer leurs performances.
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
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
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