"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 +
18 réponses
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
(qui est Alias pour del
, erase
, rd
, ri
, rm
et rmdir
) et prend un argument -Recurse
qui peut être court-circuité à -r
rd -r "path"
Admin:
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 trop long du chemin du fichier:
mkdir \empty
robocopy /mir \empty folder
RMDIR [/S] [/Q] [drive:]path
RD [/S] [/Q] [drive:]path
/S
Supprime tous les fichiers et répertoires dans le répertoire spécifié en plus du répertoire lui-même. Utilisé pour supprimer une arborescence de répertoires./Q
le mode Silencieux, ne demandez pas si ok pour supprimer une arborescence avec/S
Allez dans le 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.
Pour supprimer un répertoire (qu'il existe ou non), utilisez ce qui suit:
if exist myfolder ( rmdir /s/q myfolder )
Voici ce que vous devez faire...
Créez un fichier batch avec la ligne suivante
RMDIR /S %1
Enregistrez votre fichier de commandes que Remove.bat
et le mettre 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 tout! Vous pouvez maintenant cliquer avec le bouton droit sur n'importe quel répertoire et utiliser la fonction RMDIR
Tout d'abord, passons en revue ce que fait rm -rf
:
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 -rf
est couramment utilisé où il est prévu de retourner 0
:
- le chemin spécifié n'existe pas.
- le chemin spécifié existe et est un répertoire.
- le chemin spécifié existe et est un fichier.
Je vais ignorer toute la chose 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 définissez ERRORLEVEL
sur 0, puis supprimez le chemin uniquement s'il existe, en utilisant différentes commandes selon qu'il s'agit ou non d'un répertoire. {[6] } ne définit pas ERRORLEVEL
à 0 si le chemin n'existe pas, donc définir ERRORLEVEL
à 0 en premier est nécessaire pour détecter correctement le succès d'une manière qui imite l'utilisation normale de rm -rf
. Garder le RD
avec IF EXIST
est nécessaire car RD
, contrairement à rm -f
, lancera une erreur si la cible ne le fait pas exister.
L'extrait de script suivant suppose que DELPATH est préquoté. (C'est sûr, quand vous faites quelque chose comme SET DELPATH=%1
. Essayez de mettre ECHO %1
dans un .cmd
et de lui passer un argument avec des espaces et voyez ce qui se passe pour vous-même). Une fois l'extrait 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 Point est que tout est plus simple lorsque l'environnement est juste conforme à POSIX. Ou si vous installez un MSYS minimal et utilisez-le simplement.
Voici ce qui a fonctionné pour moi:
Essayez simplement de diminuer la longueur du chemin. c'est-à-dire :: renommez tous les dossiers qui mènent à un tel fichier en plus petits noms possibles. Dites un nom de lettre. Continuez à renommer vers le haut dans la hiérarchie des dossiers. Par ce u réduire efficacement la longueur du chemin. Maintenant, essayez enfin de supprimer le fichier tout de suite.
Cela supprimera "mon dossier" et son contenu sans invite:
rd /s /q "C:\Users\jerry.g\AppData\Roaming\my folder"
Utiliser Powershell 5.1
get-childitem *logs* -path .\ -directory -recurse | remove-item -confirm:$false -recurse -force
Remplacez logs par le nom de répertoire que vous souhaitez supprimer.
Get-childitem recherche le répertoire children avec le nom récursivement à partir du chemin actuel (.).
Remove-item supprime le résultat.
Il y a aussi deltree si vous êtes sur une ancienne version de windows.
J'aime vraiment ce site pour trouver des commandes: SS64: Del-supprimer les fichiers