Vous n'avez pas besoin de longs chemins d'accès si vous chdir
dans le répertoire et utilisez simplement des chemins relatifs vers rmdir
.
Ou, si vous avez un shell POSIX installé, ou si vous portez ceci à l'équivalent DOS :
# code non testé, je n'ai pas pris la peine de tester puisque l'OP a déjà résolu le problème.
while [ -d Folder1 ]; do
mv Folder1/Folder1/Folder1/Folder1 tmp # répète plus de fois pour travailler en plus gros lots
rm -r Folder1 # enlever les premiers niveaux restants après avoir déplacé l'arborescence principale
# puis répéter pour finir avec l'arbre restant sous le nom d'origine
mv tmp/Folder1/Folder1/.../Folder1 Folder1
rm -r tmp
done
(Utiliser une variable d'environnement pour suivre où vous l'avez renommée pour la condition de la boucle est l'autre alternative à dérouler la boucle comme je l'ai fait là.)
Cela évite les surdébits CPU de la solution de KenD, qui force le système d'exploitation à parcourir l'arbre du haut au niveau n
à chaque fois qu'un nouveau niveau est ajouté, vérifiant les permissions etc. Donc cela a une complexité temporelle de sum(1, n) = n * (n-1) / 2 = O(n^2)
. Les solutions qui suppriment un morceau du début de la chaîne devraient être O(n)
, sauf si Windows doit parcourir un arbre lors du renommage de son répertoire parent. (Linux/Unix non plus.) Les solutions qui font chdir
jusqu'au bas de l'arbre et utilisent des chemins relatifs à partir de là, en supprimant les répertoires pendant qu'ils remontent, devraient également être O(n)
, en supposant que le système d'exploitation n'ait pas besoin de vérifier tous vos répertoires parent à chaque appel système, lorsque vous effectuez des tâches tout en étant changeé quelque part.
find Folder1 -depth -execdir rmdir {} +
exécutera rmdir tout en étant changé dans le répertoire le plus profond. Ou en fait, l'option -delete
de find fonctionne sur les répertoires, et implique -depth
. Donc find Folder1 -delete
devrait faire exactement la même chose, mais plus rapidement. Oui, GNU find sur Linux descend en balayant un répertoire, en se changeant en sous-répertoires avec des chemins relatifs, puis rmdir
avec un chemin relatif, puis chdir("..")
. Il ne rescane pas les répertoires en montant, donc il consommerait O(n)
de RAM.
C'était vraiment une approximation : strace
montre qu'il utilise ACTUELLEMENT unlinkat(AT_FDCWD, "tmp", AT_REMOVEDIR)
, open("..", O_DIRECTORY|...)
, et fchdir(le fd de l'ouverture du répertoire)
, avec un tas d'appels de fstat
mélangés, aussi. Mais l'effet est le même si l'arborescence de répertoires n'est pas modifiée pendant que find fonctionne.
modifier : Juste pour rire, j'ai essayé cela sur GNU/Linux (Ubuntu 14.10, sur un CPU Core2Duo de première génération de 2,4GHz, sur un système de fichiers XFS sur un disque WD 2.5TB Green Power (WD25EZRS)).
time mkdir -p $(perl -e 'print "annoyingfoldername/" x 2000, "\n"')
réel 0m1.141s
utilisateur 0m0.005s
système 0m0.052s
find annoyingfoldername/ | wc
2000 2000 38019001 # 2k lignes / 2k mots / 38M caractères de texte
ll -R annoyingfoldername
... eventually
ls: ne peut accéder à ./annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfoldername/annoyingfold...
time find annoyingfoldername -delete
réel 0m0.054s
utilisateur 0m0.004s
système 0m0.049s
# environ la même chose pour rm -r normal,
# qui n'a pas échoué non plus en raison de noms de chemin trop longs
(mkdir -p crée un répertoire et tous les composants de chemin manquants).
Oui, vraiment 0,05 secondes pour 2k opérations rmdir. xfs est très bon pour regrouper ensemble les opérations de métadonnées dans le journal, puisqu'ils ont corrigé les opérations de métadonnées lentes il y a environ 10 ans.
Sur ext4, la création a pris 0m0.279s, la suppression avec find a quand même pris 0m0.074s.
0 votes
Avez-vous essayé
rmdir
sans l'option silencieuse?rmdir C:\storage\folder1 /s
0 votes
Oui, même résultat désolé.
1 votes
Je vais essayer
/MIR
à la place :ROBOCOPY /MIR C:\temp\EmptyDirectory C:\Storage\Folder1
il peut également être utile d'exécuter unchkdsk
juste pour rire.1 votes
/MIR
semblait durer plus longtemps, mais a finalement échoué aussi ("robocopy a cessé de fonctionner"). Je suis un peu effrayé de faire unchkdsk
; c'est un serveur assez ancien et je crains que ce problème soit indicatif de problèmes plus importants du système de fichiers...0 votes
Quelque peu lié, j'espère que ces informations vous seront utiles : superuser.com/questions/620442/…
0 votes
Et aussi celui-ci : superuser.com/questions/416351/…
7 votes
Essayez de démarrer à partir d'un CD d'essai de bureau Linux (Ubuntu/Centos/Fedora/...) et de supprimer le dossier à partir de là.
2 votes
@KenD Si vous soupçonnez des problèmes de corruption du système de fichiers, vous devriez certainement essayer de réparer d'abord le système de fichiers. Essayer des astuces de suppression de répertoire pourrait aggraver les choses.
1 votes
Depuis (à partir de votre réponse ci-dessous), le répertoire n'était pas infini, juste très profond, si vous aviez CygWin ou UnxUtils installé, vous pouviez utiliser
find
pour effectuer une suppression des répertoires en profondeur d'abord :find Stockage/Dossier1 -depth -exec rmdir {} \;
0 votes
Avez-vous essayé
del /s /q C:\Stockage\Dossier1
?0 votes
@Johnny Je suppose que cela fonctionnerait aussi sur MSYS2.
0 votes
Si les chemins d'accès longs posent problème,
find -exec
ne vous aidera pas. Utilisez-execdir
pour utiliser un chemin relatif tout en étant placé au bon endroit.