Suppression en masse de fichiers sous Windows

141

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 plus rapidement ?

Cfinley
la source
1
Aussi demandé ici à Stack Overflow: stackoverflow.com/questions/186737/…
Hugo
6
Comment pourrais-je cibler l'aimant sur certains sous-répertoires uniquement?
Jaime Hablutzel
7
@Jaime Avec une main ferme, comme un vrai programmeur ... ;-) xkcd.com/378
Legionair
Et si c'est un disque SSD?
Benjamin Weiss
Réponse pour powershell: stackoverflow.com/questions/1752677/…
Warlike Chimpanzee

Réponses:

179

AVERTISSEMENT: si vous avez des liens symboliques vers des répertoires del, les répertoires réels seront supprimés et non les liens symboliques. Soyez très prudent avec cela et ne lancez pas ces commandes sauf si vous savez qu'il n'y a pas de lien symbolique dans le répertoire cible.


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

La suppression avec l'Explorateur Windows est une foutaise, car elle gaspille beaucoup de temps à énumérer les fichiers. Je déplace généralement les éléments que je dois supprimer vers C: \ stufftodelete et j’ai un fichier de commandes deletestuff.bat 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 rapide d'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épertoires 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, 2h34m: 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!

Hugo
la source
RD / S / Q fonctionne très bien si vous spécifiez un chemin absolu, mais pas si vous utilisez des chemins relatifs. Y a-t-il une solution?
Michael S.
1
@ Hugo: Hugo, une question: Dans les tests chronométrés ci-dessus, que ce soit pour l'une des méthodes ou les deux, avez-vous compté les fichiers immédiatement avant l'exécution de la méthode? Je demande parce que le contenu du dossier peut-être déjà dans le cache de fichiers du système d'exploitation. Merci!
William C
@WilliamC: Je ne me souviens pas exactement, mais pour les suppressions répétées avec le même contenu, je compterai immédiatement avant une suppression et ne l'aurai pas répété pour les autres suppressions (car je connaissais déjà les chiffres).
Hugo
1
Les deux commandes rmdir et del échouent lorsque des noms de chemin supérieurs à 256 caractères sont impliqués.
Nicolai Ehemann
1
AVERTISSEMENT: si vous avez des liens symboliques vers des répertoires del, les répertoires réels seront supprimés et non les liens symboliques. Soyez très prudent avec cela et ne lancez pas ces commandes sauf si vous savez qu'il n'y a pas de lien symbolique dans le répertoire cible.
user0103
18

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 .

M. Bungle
la source
Et utilisez un lien dur pour créer une connexion entre le disque et le répertoire où les fichiers sont stockés si le chemin du répertoire exact est requis.
Nime Cloud
1
@NimeCloud: Les liens physiques ne peuvent pas croiser des systèmes de fichiers ou des répertoires de liens.
Grawity
5
Cependant, les liens symboliques peuvent croiser des systèmes de fichiers et des répertoires de liens, ils pourraient donc être appropriés ici. Voir la commande mklink (Vista et versions ultérieures; sinon, utilisez la jonction de Mark Russinovich / SysInternals.)
Robert Calhoun le
9

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

del /f /s /q foldername 
lmsasu
la source
C’est génial parce qu’il répertorie ce que sa suppression .. mais c’est la même chose que rd en termes de vitesse.
bobobobo
1
Oh Woah Woah Woah. Pas aussi bon que je pensais. Il supprime les fichiers rapidement mais laisse l’arborescence de répertoires intacte.
bobobobo
1
Ce que je pourrais ajouter prend beaucoup de temps pour effacer en utilisant rd.
bobobobo
3
@bobobobo J'ai fait des tests avec environ 30 Go / 1 000 000 fichiers / 15 000 dossiers et del + rd est presque trois fois plus rapide que simplement rd: superuser.com/questions/19762/mass-deleting-files-in-windows/…
Hugo
1
Cela échouera si le chemin est plus long que 256 caractères.
Nicolai Ehemann
7

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/

rautamiekka
la source
Avez-vous déjà fait ou vu des comparaisons temporelles entre TeraCopy et rmdir ou del ou del + rmdir similaires?
Hugo
1
@ Hugo: Question stupide. Je ne recommanderais pas TeraCopy s'il n'était pas visible à l'œil nu, c'est plus rapide!
Rautamiekka
5
Alors estimez-vous que c'est 10% plus rapide? Deux fois plus vite? Dix fois plus vite? Un million de fois plus vite? Ce serait formidable si vous pouviez le comparer à rmdir avec deux grands ensembles de tests identiques.
Hugo
1
Je vous remercie! J'utilise TeraCopy depuis des années, mais je n'avais jamais entendu parler de la fonction de suppression en masse. Et vous avez raison, c'est beaucoup, BEAUCOUP plus vite!
AzDayton
1
@ Amalgovinus Vous ne faites pas. Vous pouvez soit ouvrir le programme et ajouter des fichiers / dossiers par un glisser-déposer ou un clic droit, soit par un clic droit sur vos fichiers / dossiers dans Explorer / sur le bureau. Une fois que vous avez terminé, cliquez simplement sur «Supprimer», puis sur «Déplacer vers la corbeille» si vous le souhaitez, mais je privilégie l'option «Supprimer du disque». Cependant, vous devrez démarrer TeraCopy en tant qu’administrateur pour que celui-ci apparaisse dans le bureau / Explorer avec un clic droit si ce n’est pas fait par défaut.
Rautamiekka
6

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 changé selon votre local (stand pour 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!

Magallanes
la source
1
Habituellement, vous ne devriez pas utiliser %1dans un script, mais "%~1". Ainsi, si l'argument a été passé avec des guillemets, il est décoté et recoté. S'il n'a pas été passé avec des guillemets, il est cité.
Benoit le
4

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
Benoit
la source
Ajoutez un "> nul" à la fin de cet appel de robocopy pour que vous n'ayez pas à le voir à l'écran.
JoshDM
C'est semblable à l'utilisation de rsyncsous Linux. C'est même ici plus vite alors rmdir?
Hastur
Pour votre information, cette copie est très différente de del /f/q/s+ rmdir /s/q. Si votre dir_to_wipe a des problèmes, c:\some_important_dirvous finirez par perdre vos données.
Pavel P
@Pavel utilise ensuite / XJ pour exclure les points de jonction et les liens symboliques?
Bernhard
Cela a fonctionné pour un répertoire de ~ 36 Go contenant des centaines de répertoires et de fichiers de plus de 256 caractères, ce qui a entraîné l'échec de la "méthode" del / rmdir. Cela a pris quelques secondes, Windows Explorer estimait les heures!
3

Utilisez la commande rd / s à partir de l'invite de commande.

JP Alioto
la source
2
Non, c'est aussi lent que la suppression de l'explorateur.
bobobobo
Eh bien, tout va bien. Fonctionne mieux que del / f / s / q, de toute façon.
bobobobo
3
Eh bien, c'est BEAUCOUP mieux que d'utiliser Explorer pour supprimer, en fait. Il continue à supprimer, même si une suppression ou deux échouera (où l'explorateur étrangle et avorte)
bobobobo
2

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.

Ryan Thompson
la source
1

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

CarlF
la source
C'est exactement la même chose que rd /q /s...
Joey
Trop de travail et une vitesse presque équivalente!
Adeelx
1
Ce n'est pas pire que les nombreuses autres réponses install-tool-X-and-use-it ici, et ne devraient pas être rejetées si elles ne le sont pas.
JdeBP
2
Est-ce que cygwin est rmvraiment aussi rapide que cmd.exe rd? Parce que l’émulation cygwin de l’interface posix est plutôt lente car elle nécessite un travail supplémentaire, cela rmn’apprécie vraiment pas.
Jan Hudec
En attendant la suppression d’une importante collection de fichiers, j’ai eu le temps d’installer Cygwin et d’essayer rm -rf. Environ 10 minutes plus tard, j’ai abandonné la procédure et y suis retourné del /f/s/qcar, avec Cygwin, l’utilisation du disque n’était que de 50%. Sous del, l'utilisation du disque est fixée à 100%. Je pense donc que la suppression doit être plus rapide. L'utilisation du processeur est <1% pour les deux méthodes. Je ne suis pas sûr du numéro de fichier car j'ai fermé le suppresseur de fichiers Windows après 10 minutes de calcul.
Derek Ziemba
1

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.

MSalters
la source
0

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.

Stephen Kellett
la source
0

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 les performances si elles ne sont pas exactement comparées aux mêmes conditions:

  • 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, emplacement et géométrie
    • 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 empêcher tout biais de mise en cache dû à 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 l'écart 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
Alex S
la source
échoue avec des noms> 256 caractères
0

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 de 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 existe des liens non saturés dans le dossier que vous souhaitez supprimer, l'utilisation de takeown et icacls changera les autorisations et les propriétaires de fichiers extérieurs. le dossier.

À l'aide de l'outil ln.exe, vous pouvez répertorier tous les fichiers liés dans le dossier et savoir s'ils sont liés aux fichiers hors du dossier (liens non saturés):

ln.exe --enum foldername > HardlinksList.txt
liamZ
la source
-1

La suppression de dossier est plus rapide que la suppression de plusieurs fichiers.

Donc, si vous préférez utiliser la souris au lieu de l'invite de commande, vous pouvez créer un répertoire, y déplacer des fichiers et le supprimer (avec Maj + Suppr comme vous l'avez dit).

Danijelk
la source
2
Le répertoire doit être créé sur la même partition que celle où résident les fichiers. Cela rendra l'action de mouvement instantanée. Si le nouveau dossier et les fichiers se trouvent sur des partitions séparées, l'opération de copie dans son ensemble durera beaucoup.
5
Où trouvez-vous l'idée que la suppression d'un dossier est plus rapide que la suppression des fichiers qu'il contient? La suppression d'un dossier consiste, dans un premier temps, à supprimer tous les fichiers de ce dossier, afin d'éviter toute accélération. Passer à la corbeille est une tout autre affaire, mais ce n'est pas la question.
Joey