J'ai un répertoire qui contient des millions de sous-répertoires et des milliards de fichiers. Et maintenant je dois l'effacer. Dire mille milliards, je ne parle pas de la taille du fichier, mais du nombre de fichiers.
J'ai essayé de le supprimer del/s
et d'utiliser l'Explorateur Windows. Aucun des deux ne peut terminer la tâche. J'ai essayé de supprimer certains des sous-répertoires un par un, et cela m'a pris des jours. Le problème que j'ai rencontré était que chaque fois, peu importe l'utilisation del
ou l'explorateur, je peux voir dans le Gestionnaire des tâches que l'instance de l'explorateur consomme une mémoire vertigineuse et pousse progressivement mon système à planter.
Il reste encore quelques centaines de millions de fichiers à supprimer. Y a-t-il une possibilité de réaliser avec une (ou juste quelques) commandes / actions?
[ÉDITÉ]
J'ai essayé de le faire avec Cygwin rm -fr
et j'ai obtenu le même résultat. Résumée comme:
Peu importe l'utilisation de l'Explorateur Windows, à
DEL
partir de l'invite de commande ou de larm
commande Cygwin , la mémoire système tombe progressivement à zéro et la boîte se bloquera éventuellement.Si à tout moment, avant que le système ne tombe en panne, le processus est fermé (par CTRL + C ou quoi d'autre), la boîte continuera à fonctionner normalement. Cependant, toute la mémoire utilisée ne sera PAS libérée. Dites, j'ai arrêté le processus alors que la mémoire système atteint 91%, le Gestionnaire des tâches indique: 4 Go de RAM au total, le cache est de 329 Mo et 335 Mo disponibles. Ensuite, l'utilisation de la mémoire restera autour de ce niveau jusqu'à ce que je redémarre la machine. Si j'arrête l'instance de l'explorateur dans le Gestionnaire des tâches, l'écran deviendra vierge avec la lumière du disque dur allumée en permanence et ne reviendra jamais. Normalement, lorsque j'arrête l'instance de l'explorateur dans le Gestionnaire des tâches, je peux la réinvoquer en appuyant sur Win + E, ou elle a été redémarrée automatiquement.
Eh bien, vraiment une bonne gestion de la mémoire!
[MODIFIER ENCORE] Il semble qu'une partie de la mémoire utilisée a été libérée après un long moment, mais pas tout. Une partie de la mémoire en cache et disponible est revenue dans le Gestionnaire des tâches. Je n'ai plus attendu, je ne sais pas ce qui va se passer ensuite.
la source
Réponses:
Explication technique
La raison pour laquelle la plupart des méthodes posent problème est que Windows essaie d'énumérer les fichiers et les dossiers. Ce n'est pas vraiment un problème avec quelques centaines - ou même mille - fichiers / dossiers à quelques niveaux de profondeur, mais lorsque vous avez des milliards de fichiers dans des millions de dossiers à des dizaines de niveaux, cela va définitivement gâcher le système. .
Laissez-nous avoir «seulement» 100 000 000 de fichiers, et Windows utilise une structure simple comme celle-ci pour stocker chaque fichier avec son chemin (de cette façon, vous évitez de stocker chaque répertoire séparément, économisant ainsi une surcharge):
Selon qu'il utilise des caractères 8 bits ou des caractères Unicode (il utilise Unicode) et si votre système est 32 bits ou 64 bits, alors il aura besoin entre 25 Go et 49 Go de mémoire pour stocker la liste (et c'est un très structure simplifiée).
La raison pour laquelle Windows essaie d'énumérer les fichiers et les dossiers avant de les supprimer varie selon la méthode que vous utilisez pour les supprimer, mais l'Explorateur et l'interpréteur de commandes le font (vous pouvez voir un délai lorsque vous lancez la commande). Vous pouvez également voir l'activité du disque (LED HDD) clignoter lors de la lecture de l'arborescence de répertoires du lecteur.
Solution
Votre meilleur pari pour faire face à ce genre de situation est d'utiliser un outil de suppression qui supprime les fichiers et les dossiers individuellement, un par un. Je ne sais pas s'il existe des outils prêts à l'emploi pour le faire, mais il devrait être possible d'accomplir avec un simple fichier de commandes.
Cela permet de vérifier si un argument a été transmis. Si tel est le cas, il se transforme en répertoire spécifié (vous pouvez l'exécuter sans argument pour démarrer dans le répertoire en cours ou spécifier un répertoire - même sur un autre lecteur pour qu'il démarre là).
Ensuite, il supprime tous les fichiers du répertoire actuel. Dans ce mode, il ne doit rien énumérer et simplement supprimer les fichiers sans aspirer beaucoup de mémoire, le cas échéant.
Ensuite, il énumère les dossiers dans le répertoire en cours et s'appelle lui-même, en lui passant chaque dossier (auto) pour reculer vers le bas.
Une analyse
La raison pour laquelle cela devrait fonctionner est qu'elle n'énumère pas tous les fichiers et dossiers de l' arborescence entière . Il n'énumère aucun fichier et énumère uniquement les dossiers du répertoire actuel (plus les autres dans les répertoires parents). En supposant qu'il n'y a que quelques centaines de sous-répertoires dans un dossier donné, cela ne devrait pas être trop mauvais et nécessite certainement beaucoup moins de mémoire que les autres méthodes qui énumèrent l'arborescence entière.
Vous pouvez vous demander d'utiliser le
/r
commutateur au lieu d'utiliser la récursion (manuelle). Cela ne fonctionnerait pas car, bien que le/r
commutateur effectue une récursivité, il pré-énumère l'arborescence de répertoires entière, ce qui est exactement ce que nous voulons éviter; nous voulons supprimer au fur et à mesure sans suivre.Comparaison
Permet de comparer cette méthode aux méthodes de dénombrement complet.
Vous aviez dit que vous aviez «des millions d'annuaires»; disons 100 millions. Si l'arborescence est approximativement équilibrée et en supposant une moyenne d'environ 100 sous-répertoires par dossier, alors le répertoire imbriqué le plus profond serait d'environ quatre niveaux plus bas - en fait, il y aurait 101 010 100 sous-dossiers dans toute l'arborescence. (Amusant de voir comment 100M peut se réduire à 100 et 4.)
Étant donné que nous n'énumérons pas les fichiers, nous devons seulement garder une trace d'au plus 100 noms de répertoire par niveau, pour un maximum de
4 × 100 = 400
répertoires à un moment donné.Par conséquent, la mémoire requise devrait être de ~ 206,25 Ko, bien dans les limites de tout système moderne (ou autre).
Tester
Malheureusement (?) Je n'ai pas de système avec des milliards de fichiers dans des millions de dossiers, donc je ne suis pas en mesure de le tester (je crois qu'au dernier décompte, j'avais environ ~ 800 Ko de fichiers), donc quelqu'un d'autre devra essayer il.
Caveat
Bien sûr, la mémoire n'est pas la seule limitation. Le lecteur sera également un gros goulot d'étranglement car pour chaque fichier et dossier que vous supprimez, le système doit le marquer comme libre. Heureusement, bon nombre de ces opérations sur disque seront regroupées (mises en cache) et écrites en morceaux plutôt qu'individuellement (au moins pour les disques durs, pas pour les supports amovibles), mais cela provoquera toujours un peu de thrashing pendant la lecture du système. et écrit les données.
la source
/r
commutateur, comme je l'ai expliqué, il essaiera d'énumérer tous les fichiers. Si vous utilisez le/d
commutateur, il énumère uniquement les dossiers du répertoire en cours. Par conséquent, sauf si vous avez un milliard de dossiers dans le répertoire en cours, cela ne devrait pas poser de problème.Je ne peux pas parler des milliers de milliards de fichiers, mais j'ai récemment supprimé un ancien partage de fichiers qui contenait environ 1,8 million de fichiers en utilisant:
"EmptyTMPFolder" est un répertoire local vide. l'option / MIR fera ressembler la cible à la source (vide).
Le véritable avantage de cette approche a été l'option de nouvelle tentative (/ R: 30). Cela a permis d'absorber tous les problèmes de connectivité pouvant survenir au cours de ce processus. Les suppressions locales peuvent ne pas bénéficier de cette approche.
Je n'ai pas de repères spécifiques pour comparer les temps, mais je préférerais cela à certaines des autres options suggérées b / c des options de nouvelle tentative / attente. Les suppressions ont commencé presque instantanément.
la source
La suppression de tous les dossiers prendra du temps et vous ne pouvez pas faire grand-chose à ce sujet. Ce que vous pouvez faire est de sauvegarder vos données et de formater votre disque. Ce n'est pas optimal, mais cela fonctionnera (et rapidement).
Une autre option consiste peut-être à utiliser une distribution Linux sur un CD live pouvant lire à partir d'une partition NTFS. Je sais par expérience personnelle qui
rm -rf folderName
peut fonctionner pendant au moins 2 jours sans planter un système avec 2 Go de RAM. Cela prendra un certain temps, mais au moins cela se terminera.la source
Euh .. Je ne veux pas savoir comment tu en as créé autant.
Ce qui se passe, c'est qu'Explorer essaie d'énumérer chaque fichier et de stocker les informations en mémoire avant de commencer la suppression. Et il y en a évidemment beaucoup trop.
Avez-vous essayé la commande
rmdir /s
? Tant qu'il supprime réellement les fichiers tels qu'ils sont trouvés plutôt que d'attendre que chacun d'eux soit énuméré, cela peut fonctionner.Combien de niveaux de sous-répertoires existe-t-il? S'il n'y en a qu'un ou un autre petit nombre, un fichier de commandes rapide qui se répète manuellement peut fonctionner.
Cependant, toute méthode prendra un certain temps.
la source
rm -rf
fait. Cela fonctionne mieux avec des structures de répertoires relativement peu profondes. Je ne sais pas sirmdir /s
c'est le cas. Ça devrait .rmdir /?
:/s Removes all directories and files in the specified directory in addition to the directory itself. Used to remove a directory tree.
En d'autres termes, l'/s
indicateur supprime également les fichiers. Comment l'avez-vous utilisédel
? Et oui, il serait peut-être préférable de simplement l'utiliserrm -rf
comme suggéré par soandos.Une cause possible d'un problème comme celui-ci est le provisionnement fin, généralement trouvé dans les environnements SAN. Certains disques SSD peuvent présenter le même problème. Si tel est le cas, ce changement de configuration peut résoudre votre problème:
Notez que cette modification peut avoir un impact sur les performances des disques SSD et peut empêcher une révision automatique et / ou manuelle des disques SAN.
la source
Shift+ Deleteignore la corbeille et pourrait accélérer considérablement les choses.
Si cela ne fonctionne pas (cas extrêmes), essayez Fast Folder Eraser et / ou Mass Directory Eraser
la source
Il s'agit probablement de votre antivirus / anti-programme malveillant qui consomme toute la mémoire, puis bloque le système.
Windows lui-même n'a pas de problème à supprimer un grand nombre de fichiers, bien qu'il soit certainement plus lent qu'une opération similaire sur la plupart des systèmes de fichiers non Microsoft.
la source
Un problème que vous pourriez rencontrer est que le répertoire n'est pas compacté lorsque vous supprimez un fichier / dossier, donc si vous avez un dossier contenant 1 million de fichiers et supprimez les premiers 500k d'entre eux. Il y a une tonne de blocs au début de votre répertoire qui sont à toutes fins utiles vides.
MAIS, l'explorateur et une invite de commande doivent toujours parcourir ces blocs au cas où il y aurait un fichier. Quelque chose qui pourrait aider est de «déplacer» un dossier d'un endroit quelconque de l'arborescence vers un nouveau dossier hors de la base du lecteur, puis de supprimer ce nouveau dossier. Le déplacement du dossier ne fera que déplacer le pointeur vers le dossier, il devrait donc aller rapidement et ne pas déplacer réellement tous les fichiers qu'il contient vers un nouvel espace sur le lecteur.
Une autre chose que vous pouvez essayer est d'utiliser un outil tiers comme "PerfectDisk" dans les dossiers Compact après avoir supprimé un tas de fichiers.
la source
En essayant diverses approches pour supprimer plus de 10 millions de fichiers journaux de fusion, j'ai remarqué qu'environ 30K fichiers en moyenne pouvaient être supprimés sur une période de 10 minutes. Cela prendrait environ 55 heures pour les 10 millions de fichiers ...
En utilisant le script ci-dessous, le taux de suppression a augmenté de ~ 75%. Les listes de fichiers sont créées et exécutées par des processus simultanés augmentant les opérations sur le disque (mais pas de manière linéaire.) Je montre 4 fourchettes, mais deux pourraient suffire.
Il existe une option pour utiliser PowerShell, ce qui réduit considérablement le temps requis pour préparer les listes.
BTW, j'ai testé en utilisant deux opérations de suppression directe permettant des collisions, mais il n'y a pas eu de réduction notable du temps de suppression global par rapport à une seule opération de suppression. Et bien qu'il ne soit peut-être pas souhaitable de créer des listes de suppression, le temps gagné en valait la peine.
la source
Essayez ceci et modifiez-le selon vos besoins.
Il s'agit d'un script testé sur Win2003 basé sur les explications et analyses techniques de Synetech, répondu le 15 octobre 13 à 15h22.
Testrun .. Il existe des dossiers comme A1 à A4, B1 à B4 et C1 à C4 imbriqués différemment ..
Je ne peux pas commenter (le site se plaint de ma réputation), alors j'ajoute mon commentaire ici ..
La solution de Bjv crée des listes de fichiers temporaires inutiles. Et puis les réitère une deuxième fois pour faire le travail réel. /superuser//a/892412/528695
Le script original de Synetech n'a pas fonctionné pour moi. /superuser//a/416469/528695
Résultats..
la source
J'ai eu des problèmes similaires il y a quelque temps avec seulement 10 millions de fichiers, mais dans un serveur 2003, pour supprimer les fichiers, j'ai utilisé un serveur / client ftp et j'ai laissé le client supprimer les fichiers et les dossiers. C'est une solution lente mais cela fonctionne parfaitement.
Vous aurez probablement un deuxième problème avec le MFT dans NTFS qui n'a pas de solution, le MFT est un tableau qui dans Win 2003 (je ne suis pas sûr que Microsoft ait une solution après Win 2003) stocke tous les fichiers de manière incrémentielle afin avec des milliards de fichiers, la taille sera folle, dans mon cas, la MFT avait 17 millions d'enregistrements et la taille de la MFT était d'environ 19 Go avec seulement 45000 fichiers, j'ai testé dans d'autres systèmes et ressemble à 1 million d'enregistrements la MFT être d'environ 1 Go.
Vous pouvez vérifier l'état du MFT avec cette commande:
C:
- lettre d'unité/a
- analyser/v
- verbeuxUne autre solution délicate, car il n'y a aucun outil qui peut réduire la MFT, les outils remplissent simplement 0 le nom des fichiers et des propriétés mais rien de plus, mais vous pouvez utiliser le convertisseur VMware ou un autre type de P2V et créer une machine virtuelle basée sur votre serveur, de cette façon vous réglerez tous les problèmes liés à la MFT, je n'ai jamais testé la conversion de V2P, maintenant je travaille uniquement dans des environnements virtuels, mais j'ai vu beaucoup d'informations à ce sujet sur internet.
Cette victoire 2003 fonctionne parfaitement maintenant, la taille du MFT est de 40 Mo et tout va bien, si vous voulez, je peux vous en dire plus sur les sauvegardes, défragmentation ou autres tâches liées à des millions de petits fichiers.
la source
Selon cette réponse sur StackOverflow, utilisez une combinaison de
del
etrmdir
:la source
Étant donné que la suppression des fichiers à la fois utilise trop de mémoire, vous avez besoin d'un moyen de les supprimer un à la fois, mais avec un processus automatisé. Ce genre de chose est beaucoup plus facile à faire dans un shell de style Unix, alors utilisons Cygwin. La commande suivante génère une liste de fichiers ordinaires, transforme cette liste en une séquence de
rm
commandes, puis envoie le script résultant à un shell.Le script est exécuté même en cours de génération, et il n'y a pas de boucles, donc le shell n'a pas (espérons-le) à créer de gros fichiers temporaires. Cela prendra certainement un certain temps, car le script comporte des millions de lignes. Vous devrez peut-être modifier la
rm
commande (peut-être que j'aurais dû utiliser-f
? Mais vous comprenez mieux vos fichiers que moi) pour le faire fonctionner.Il ne vous reste plus que des répertoires. Voici où les choses deviennent difficiles. Peut-être avez-vous supprimé suffisamment de fichiers pour pouvoir vous
rm -rf
passer de mémoire insuffisante (et ce sera probablement plus rapide qu'un autre script). Sinon, nous pouvons adapter cette réponse Stackoverflow :Encore une fois, des ajustements peuvent être nécessaires, cette fois avec
sort
, pour éviter de créer d'énormes fichiers temporaires.la source
J'ai rencontré le même problème il y a quelque temps. J'ai écrit un petit utilitaire qui fait exactement cela: supprimer récursivement un répertoire. Il n'énumérera pas les fichiers et ne consommera pas beaucoup de mémoire (O (n + m) au maximum avec n = profondeur maximale du répertoire et m = nombre maximal de fichiers / répertoires dans l'un des sous-répertoires). Il peut gérer de longs chemins de fichiers (> 256 caractères). J'aimerais recevoir des commentaires si vous pouvez résoudre votre problème avec cela.
Vous pouvez le trouver ici: https://github.com/McNetic/fdeltree (exécutable dans le dossier des versions)
la source
J'ai trouvé ce fil à la recherche d'un meilleur moyen que moi pour supprimer plus de 3 millions de fichiers sur plusieurs des serveurs que je supporte. Ce qui précède est bien au-dessus de l'OMI compliquée, j'ai donc fini par utiliser ma méthode connue d'utilisation de l'outil de ligne de commande "FORFILES" dans Windows (c'était sur Server 2003).
Quoi qu'il en soit, voici la commande FORFILES que j'ai utilisée pour supprimer TOUS les fichiers d'un dossier de la ligne de commande.
forfiles / P "VOTRE CHEMIN DE DOSSIER ICI (par exemple C: \ Windows \ Temp)" / C "cmd / c echo @file & del / f / q @file"
Le nom ci-dessus indique également le nom des fichiers qui sont supprimés à l'écran, mais uniquement parce que je voulais voir une certaine progression de celui-ci en train de faire quelque chose, si vous ne faites pas écho à quelque chose, il semble que la boîte DOS se soit bloquée, même bien qu'il fasse le travail OK comme prévu.
Cela prend un peu de temps pour démarrer, c'est-à-dire qu'il ne fait rien pendant un certain temps (environ 30 m pour ~ 3 millions de fichiers) mais vous devriez finalement voir les noms de fichiers commencer à apparaître lorsqu'ils sont supprimés. Cette méthode prend également beaucoup de temps pour supprimer les fichiers (le temps de suppression peut être réduit sans l'écho?), Mais cela fonctionne finalement sans planter la machine, sur les fichiers de mon serveur, j'utilisais ~ 1850 Ko de mémoire pendant le processus de suppression. .
La durée de la suppression peut provoquer un problème si vos serveurs ont une déconnexion automatique car vous devez garder la souris en mouvement (je recommanderais de fonctionner en tant qu'utilisateur de la console, ou via un outil tiers tel que LanDesk ou SCCM, etc. (ou MouseJiggle). EXE))
Quoi qu'il en soit, j'ai pensé partager ma réponse, bonne chance à tous!
la source