«Rm -rf» équivalent pour Windows?


509

J'ai besoin d'un moyen de supprimer récursivement un dossier et ses enfants.

Existe-t-il un outil prédéfini pour cela, ou dois-je en écrire un?

DEL /S ne supprime pas les répertoires.

DELTREE a été supprimé de Windows 2000+


1
Del / s (a) ne fonctionne-t-il pas du tout (il n'est disponible que dans certaines versions) ou (b) quitte-t-il le répertoire de niveau supérieur mais supprime-t-il tout ce qu'il contient ou (c) laisse-t-il tous les répertoires tout en supprimant tous les fichiers?
wnoise

@Aaron, réponse c, vous devez utiliser rmdir / s pour supprimer les répertoires et les fichiers.
Wedge

31
N'est-ce pas vraiment format c:alors l'installation de Linux? Je plaisante bien sûr.
Basile Starynkevitch

Réponses:


694

RMDIR ou RD si vous utilisez l'invite de commande classique (cmd.exe):

rd /s /q "path"

RMDIR [/ S] [/ Q] [lecteur:] chemin

Chemin RD [/ S] [/ Q] [lecteur:]

/ S Supprime tous les répertoires et fichiers du répertoire spécifié en plus du répertoire lui-même. Utilisé pour supprimer une arborescence de répertoires.

/ Q Mode silencieux, ne demandez pas si vous pouvez supprimer une arborescence de répertoires avec / S

Si vous utilisez PowerShell , vous pouvez utiliser Remove-Item( ce qui est à aliasé del, erase, rd, ri, rmet rmdir) et prend un -Recurseargument qui peut être court - circuitée-r

rd -r "path"

84
Il convient de souligner que pour un grand nombre de fichiers, rmdir / s / q est généralement beaucoup plus rapide que l'opération équivalente "sélectionner dir, déplacer + supprimer" dans l'explorateur.
Wedge

9
Cela ne supprime pas les fichiers, comme le fait rm -rf, et renvoie également une valeur non nulle lorsque le répertoire n'existe pas, donc rd /s /q foo && echo "yay"échouera si le répertoire "foo" n'existe pas.
Dirk Groeneveld

17
Et si dir. pas vide et certains fichiers obtiennent Access is deniedet d'autres The process cannot access the file because it is being used by another process?
Eugene

6
Je viens d'essayer cela en sept et vous devez faire / S et / Q (majuscules)
ford prefect

2
Mystifié ici. Je sais que j'ai essayé cette commande et cela n'a pas fonctionné s'il y avait des fichiers dans l'arborescence des répertoires; maintenant je reviens et. . . par magie, cela semble fonctionner. Quelqu'un d'autre a-t-il un comportement incohérent avec cela?!
Alex Hall

139

administrateur:

takeown /r /f folder
cacls folder /c /G "ADMINNAME":F /T
rmdir /s folder

Fonctionne pour tout, y compris les fichiers sys

EDIT: J'ai en fait trouvé le meilleur moyen qui résout également le problème du chemin de fichier trop long:

mkdir \empty
robocopy /mir \empty folder

3
Mon héros! Et une astuce: vous créez votre dossier vide dans C: \ empty, puis une fois à l'intérieur de chaque dossier fou, on peut juste fairerobocopy /mir c:\empty .
Léon Pelletier

Le takeownm'a aidé comme je l' ai copié du dossier système Linux avec rsync par erreur et j'ai eu aucun privilège de retirer ce dossier ... Pas même le robocopy a travaillé. Merci
Jarda

1
Très belle réponse. Ça marche. (toutes les autres réponses sur la page ne le font pas). Mais cacls est obsolète. Est-il possible de faire une réponse contemporaine, s'il vous plaît? La deuxième variante fonctionne déjà et n'est pas déconseillée.
Gangnus

Cela ne fait rien pour moi. Quelqu'un pourrait-il expliquer comment cela est censé fonctionner? (robocopy) - Il pourrait supprimer le contenu des dossiers, mais pas les dossiers eux
Ralf

114

RMDIR [/S] [/Q] [drive:]path

RD [/S] [/Q] [drive:]path

  • /S Supprime tous les répertoires et fichiers du répertoire spécifié en plus du répertoire lui-même. Utilisé pour supprimer une arborescence de répertoires.

  • /Q Mode silencieux, ne demandez pas si vous pouvez supprimer une arborescence de répertoires avec /S


13
Merci pour l'explication des paramètres. La réponse acceptée ne fait malheureusement pas cela.
Thomas

1
Réponse la plus simple et parfaite à la question. Doit être accepté.
Artif3x


19

Accédez au chemin et déclenchez cette commande.

rd /s /q "FOLDER_NAME"

/ s: supprime le répertoire spécifié et tous les sous-répertoires, y compris tous les fichiers. Utilisez / s pour supprimer un arbre.

/ q: exécute rmdir en mode silencieux. Supprime les répertoires sans confirmation.

/? : Affiche l'aide à l'invite de commande.


9

Pour supprimer un répertoire (qu'il existe ou non), utilisez ce qui suit:

if exist myfolder ( rmdir /s/q myfolder )


6

La réponse acceptée est excellente, mais en supposant que vous avez installé Node, vous pouvez le faire beaucoup plus précisément avec la bibliothèque de nœuds "rimraf", qui permet des modèles globulaires. Si vous l'utilisez beaucoup (je le fais), installez-le simplement à l'échelle mondiale.

yarn global add rimraf

puis, par exemple, un motif que j'utilise constamment:

rimraf .\**\node_modules

ou pour une seule ligne qui vous permet d'esquiver l'installation globale, mais qui prend un peu plus de temps pour le téléchargement dynamique du package:

npx rimraf .\**\node_modules

2
Une solution solide au problème car il est indépendant du système d'exploitation.
Denialos

5

Essayez cette commande:

del /s foldername

travaillé pour moi en combinaison avec rmdir / s / q car certains fichiers étaient verrouillés et rmdir échouerait sur ceux-ci. del / foldername a supprimé les fichiers verrouillés, ce qui a ensuite permis à rmdir de se débarrasser du répertoire racine. Agréable.
bbqchickenrobot


4

Voyons d'abord ce qui rm -rffait:

C:\Users\ohnob\things>touch stuff.txt

C:\Users\ohnob\things>rm -rf stuff.txt

C:\Users\ohnob\things>mkdir stuff.txt

C:\Users\ohnob\things>rm -rf stuff.txt

C:\Users\ohnob\things>ls -l
total 0

C:\Users\ohnob\things>rm -rf stuff.txt

Il y a trois scénarios où rm -rfest couramment utilisé où il devrait revenir 0:

  1. Le chemin spécifié n'existe pas.
  2. Le chemin spécifié existe et est un répertoire.
  3. Le chemin spécifié existe et est un fichier.

Je vais ignorer toute la question des autorisations, mais personne n'utilise les autorisations ou essaie de se refuser l'accès en écriture sur les choses dans Windows de toute façon (OK, c'est censé être une blague…).

Tout d' abord mis ERRORLEVELà 0 et puis supprimez le chemin que si elle existe, à l' aide de différentes commandes selon si oui ou non il est un répertoire. IF EXISTn'est pas défini ERRORLEVELsur 0 si le chemin d'accès n'existe pas, il ERRORLEVELest donc nécessaire de définir d'abord sur 0 pour détecter correctement le succès d'une manière qui imite l' rm -rfutilisation normale . Protéger le RDavec IF EXISTest nécessaire car RD, contrairement à rm -f, va lancer une erreur si la cible n'existe pas.

L'extrait de script suivant suppose que DELPATH est précité. (C'est sûr lorsque vous faites quelque chose comme SET DELPATH=%1. Essayez de mettre ECHO %1un .cmdet de lui passer un argument avec des espaces dedans et voyez ce qui se passe par vous-même). Une fois l'extrait de code terminé, vous pouvez vérifier l'échec avec IF ERRORLEVEL 1.

: # Determine whether we need to invoke DEL or RD or do nothing.
SET DELPATH_DELMETHOD=RD
PUSHD %DELPATH% 2>NUL
IF ERRORLEVEL 1 (SET DELPATH_DELMETHOD=DEL) ELSE (POPD)
IF NOT EXIST %DELPATH% SET DELPATH_DELMETHOD=NOOP
: # Reset ERRORLEVEL so that the last command which
: # otherwise set it does not cause us to falsely detect
: # failure.
CMD /C EXIT 0
IF %DELPATH_DELMETHOD%==DEL DEL /Q %DELPATH%
IF %DELPATH_DELMETHOD%==RD RD /S /Q %DELPATH%

Le fait est que tout est plus simple lorsque l'environnement est simplement conforme à POSIX. Ou si vous installez un MSYS minimal et que vous l'utilisez.



3

Voici ce que tu dois faire...

Créez un fichier de commandes avec la ligne suivante

RMDIR /S %1

Enregistrez votre fichier de commandes sous Remove.batet placez-le dansC:\windows

Créez la clé de registre suivante

HKEY_CLASSES_ROOT\Directory\shell\Remove Directory (RMDIR)

Lancez regeditet mettez à jour la valeur par défaut HKEY_CLASSES_ROOT\Directory\shell\Remove Directory (RMDIR)\default avec la valeur suivante

"c:\windows\REMOVE.bat" "%1"

C'est ça! Vous pouvez maintenant cliquer avec le bouton droit sur n'importe quel répertoire et utiliser la fonction RMDIR


3

Utilisation de Powershell 5.1

 get-childitem *logs* -path .\ -directory -recurse | remove-item -confirm:$false -recurse -force

Remplacez les journaux par le nom du répertoire que vous souhaitez supprimer.

get-childitem recherche le répertoire des enfants avec le nom récursivement à partir du chemin actuel (.).

remove-item supprime le résultat.


2

Vous pouvez installer GnuWin32 et utiliser les commandes * nix de manière native sur Windows. J'installe ceci avant d'installer quoi que ce soit d'autre sur une nouvelle copie de Windows à la menthe. :)


2

À UTILISER À VOS RISQUES ET PÉRILS. RENSEIGNEMENTS FOURNIS «TELS QUELS». NON TESTÉ EXTENSIFEMENT.

Cliquez avec le bouton droit sur l'icône Windows (généralement en bas à gauche)> cliquez sur "Windows PowerShell (Admin)"> utilisez cette commande (avec la plus grande prudence, vous pouvez facilement supprimer tous vos fichiers si vous n'y faites pas attention):

rd -r -include *.* -force somedir

Où se somedirtrouve le répertoire non vide que vous souhaitez supprimer.

Notez qu'avec des disques externes connectés ou des disques avec des problèmes, Windows se comporte parfois de manière étrange - il ne provoque pas d'erreur lors de la suppression (ou de toute tentative de copie), mais le répertoire n'est pas supprimé (ou non copié) comme indiqué. (J'ai trouvé que dans ce cas, au moins pour moi, la commande donnée par @n_y dans sa réponse produira des erreurs comme 'get-childitem: le fichier ou le répertoire est corrompu et illisible.' En conséquence dans PowerShell)


1

TARD MAIS RÉPONSE IMPORTANTE à toute personne qui a des problèmes pour installer les packages npm sur la machine Windows et si vous voyez une erreur disant " rm -rf..." commande introuvable. Vous pouvez utiliser le bash cli pour exécuter la commande rm sur Windows.

pour les utilisateurs de npm, vous pouvez modifier la configuration de npm de npm config set script-shell "C:\Program Files\Git\bin\bash.exe"cette façon si le package npm que vous essayez d'installer a un script de post-installation qui utilise la rm -rfcommande, vous pourrez exécuter cette rmcommande sans avoir à changer quoi que ce soit dans le package npm ou à désactiver la configuration des scripts de post-installation. (Par exemple, styled-componentsutilise la rmcommande dans leurs scripts de post-installation)

Si vous souhaitez simplement utiliser la rmcommande, vous pouvez facilement utiliser le bash et passer les arguments.

Alors oui, vous pouvez utiliser la commande 'rm' sur Windows.


0

Voici ce qui a fonctionné pour moi:

Essayez simplement de réduire la longueur du chemin. ie :: Renommez tous les dossiers qui mènent à un tel fichier avec les plus petits noms possibles. Dites les noms d'une lettre. Continuez à renommer vers le haut dans la hiérarchie des dossiers. Par cela, u réduit efficacement la longueur du chemin. Maintenant, essayez enfin de supprimer le fichier immédiatement.



En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.