web-dev-qa-db-fra.com

"rm -rf" équivalent pour Windows?

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+

446
FlySwat

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

rd /s /q "path"

Si vous utilisez PowerShell, vous pouvez utiliser Remove-Item (alias del, erase, rd, ri, rm et rmdir) et prend un argument -Recurse qui peut être raccourci en -r

rd -r "path"
609
Duncan Smart

admin:

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

Fonctionne pour tout, y compris les fichiers système

EDIT: J'ai en fait trouvé le meilleur moyen de résoudre le problème du chemin d'accès aux fichiers trop long:

mkdir \empty
robocopy /mir \empty folder
131
wbkang

_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_

106
Jim McKeeth

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 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.

18

Vous pouvez installer cygwin, qui a rm ainsi que ls etc.

18
user17481

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

if exist myfolder ( rmdir /s/q myfolder )
7
Clay

rmdir /S /Q %DIRNAME%

5
Branan

rmdir/s dirname

3
Brian Mitchell

Essayez cette commande:

del /s foldername
3
Jeremy Ruten

Voyons d’abord ce que rm -rf fait:

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 existe trois scénarios dans lesquels rm -rf est couramment utilisé pour renvoyer 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 l’ensemble des autorisations, mais personne n’utilise les autorisations ni ne tente de se refuser l’accès en écriture sur des éléments de Windows (OK, c’est une blague…).

Commencez par définissez ERRORLEVEL sur , puis supprimez le chemin uniquement s’il existe, en utilisant des commandes différentes selon qu’il s’agisse ou non d’un répertoire. IF EXIST ne définit pas ERRORLEVEL à 0 si le chemin n'existe pas. Par conséquent, il est nécessaire de définir d'abord ERRORLEVEL sur 0 pour détecter correctement le succès d'une manière qui imite la méthode normale rm -rf usage. Garder la RD avec IF EXIST est nécessaire car RD, contrairement à rm -f, générera une erreur si la cible n'existe pas.

L'extrait de script suivant suppose que DELPATH est pré-coté. (Ceci est sûr lorsque vous faites quelque chose comme SET DELPATH=%1. Essayez de mettre ECHO %1 dans un .cmd et en lui passant un argument avec des espaces pour voir ce qu'il se passe vous-même). Une fois que l'extrait est 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 minimum MSYS et utilisez-le.

3
binki

Voici ce que tu dois faire...

Créer un fichier batch avec la ligne suivante

RMDIR /S %1

Enregistrez votre fichier batch sous Remove.bat et mettez-le dans C:\windows

Créez la clé de registre suivante

HKEY_CLASSES_ROOT\Directory\Shell\Remove Directory (RMDIR)

Lancez regedit et 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! Maintenant, vous pouvez cliquer avec le bouton droit sur n’importe quel répertoire et utiliser la fonction RMDIR.

2
Louis

Vous pouvez installer GnuWin32 et utiliser les commandes * nix en mode natif sur Windows. Je l’installe avant d’installer quoi que ce soit d’autre sur une copie fraîche de Windows à la menthe. :)

2
epochwolf

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

yarn global add rimraf

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

rimraf .\**\node_modules

ou pour un one-liner 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
1
Artif3x

UTILISEZ AT VOTRE PROPRE RISQUE. INFORMATIONS FOURNIES "EN L'ÉTAT". NON TESTÉ PAR EXTENSION.

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

rd -r -include *.* -force somedir

somedir est le répertoire non vide que vous souhaitez supprimer.

Notez qu'avec des disques externes attachés ou des disques présentant des problèmes, Windows se comporte parfois de façon étrange - la suppression (ou toute tentative de copie) ne se produit pas d'erreur, mais le répertoire n'est pas supprimé (ou copié) comme indiqué. (J'ai constaté que, dans ce cas, du moins pour moi, la commande donnée par @n_y dans sa réponse produirait des erreurs telles que "get-childitem: le fichier ou le répertoire est corrompu et illisible." Dans PowerShell).

1
Roel Van de Paar

Utiliser 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 enfants avec le nom récursivement depuis le chemin actuel (.).

remove-item supprime le résultat.

1
n_y

via Powershell

 Remove-Item -Recurse -Force "TestDirectory"

via l'invite de commande

https://stackoverflow.com/a/35731786/4391

0
cilerler

voici ce qui a fonctionné pour moi:

Essayez simplement de diminuer la longueur du chemin. i.e :: Renommez tous les dossiers qui mènent à un tel fichier en noms les plus petits possibles. Dites les noms d'une lettre. Renommez vers le haut dans la hiérarchie des dossiers. De cette façon, vous réduisez efficacement la longueur du chemin. Enfin, essayez de supprimer le fichier immédiatement.

0
Gaurav Deochakke