Utilisation de caractères génériques avec la commande rmdir ou rd

40

Disons qu'il y a un dossier dans le D:lecteur:

D:\Air
D:\Abonden
D:\All
D:\Whatever

Je veux supprimer tous les dossiers commençant par "A" (y compris tous les sous-dossiers et fichiers). J'ai essayé cette commande:

rmdir D:\A* /s /q

Je reçois une erreur, cependant :(

Le nom de fichier, le nom de répertoire ou la syntaxe d'étiquette de volume est incorrect.

La delcommande fonctionne avec *, mais je dois également supprimer les dossiers.
Existe-t-il un moyen d'y parvenir via la rmdircommande?

serdar
la source
2
L'uniformité et le bon sens n'ont jamais été en jeu dans le développement des interpréteurs de commandes Windows ou DOS. Le plus triste est qu'il y avait des systèmes de modèles là-bas lorsque ces coques ont été développées qui auraient mis en lumière des conceptions intelligentes. Bien sûr, la coquille n'est qu'un exemple du processus de pensée horrible à inexistant qui a été utilisé pour gifler ces ordures - J'aimerais pouvoir vous dire ce que je pense vraiment, ha ha.
Rick O'Shea

Réponses:

33
cd c:\temp
for /f %i in ('dir /a:d /s /b A*') do rd /s /q %i

Utilisez-le pour tester cependant:

for /f %i in ('dir /a:d /s /b A*') do echo rd /s /q %i

Cela dirigera les commandes à exécuter dans l'invite de commande et vous permettra de voir ce qui se passe.

Gardez à l'esprit que cela recherchera également les sous-dossiers tels que "C: \ temp \ jjj \ aaa" et supprimera le dossier aaa. Si vous voulez qu'il regarde simplement les dossiers de niveau supérieur "C: \ temp \ aaa", supprimez le "/s"de la commande.

La clé de ceci est le A *, où vous mettriez votre chaîne de recherche. Cela acceptera les caractères génériques tels que aaa*, aaa*et *aaa*si vous le souhaitez.

Fazer87
la source
En l'état, la commande sera interrompue si le nom du chemin / dossier contient des espaces.
and31415
1
Pouvons-nous ajouter "IF NOT EXIST goto EFO" pour A *?
serdar
3
Cela fonctionne si le chemin contient des caractères d'espace: pour / f "delims ="% i in ('dir / a: d / s / b A *') do rd / s / q "% i"
Luis Cantero - MSFT
5
Je voudrais juste ajouter que si vous l'exécutez à partir d' un fichier batch, vous devez utiliser des signes à deux pour cent pour que la commande deviennefor /f %%i in ('dir /a:d /s /b A*') do rd /s /q %%i
Fred Clausen
pas besoin d'utiliser le drapeau 'w / sub' deux fois :)
lunicon
25

Suppression de dossiers à l'aide de caractères génériques

La commande rmdir/ rdseule ne prend pas en charge les caractères génériques (c'est-à-dire *et ?). Vous pouvez contourner cette limitation en l'enveloppant dans une forboucle.

Exemple d'utilisation

for /d %G in ("X:\A*") do rd /s /q "%~G"

Remarque Lorsque vous supprimez des fichiers et des dossiers, vous souhaiterez peut-être d'abord remplacer la rdcommande echo. De cette façon, vous pouvez vous assurer que tout ce qui ne devrait pas être supprimé le serait réellement.

Motifs multiples

Afin de supprimer plusieurs dossiers correspondant à différents modèles, la syntaxe n'est pas trop différente. Comme @dbenham l'a correctement souligné, une commande sur une seule ligne suffit. Vous pouvez également spécifier différents chemins:

for /d %G in ("X:\A*","Y:\Whatever\B*","Z:\C?D") do rd /s /q "%~G"

Bonus - Vérification de l'existence du dossier

Dans le cas où vous souhaitez vérifier si des dossiers spécifiques existent, vous pouvez utiliser la commande suivante:

dir /b /a:d "X:\A*" >nul 2>&1 && echo Folders exist. || echo No folders found.

Lectures complémentaires

et31415
la source
Pouvons-nous ajouter "IF NOT EXIST goto EFO" pour A *?
serdar
Par exemple, nous supposons qu'il n'y a pas de dossier commençant par une lettre. La commande doit donc aller pour B *. Je ne sais pas si je pourrais expliquer ou non :(
serdar
1
+1 de moi. Je ne comprends pas le vote négatif. Bien que vous puissiez faire plusieurs modèles avec vos commandes simples FOR /Det FOR /D /R. Utilisez simplement in( "A*" "B*" "C?D" ).
dbenham
1
En fait, vous avez besoin de l' /Roption, car le sous-dossier qui correspond au masque peut se trouver sous un parent qui ne le fait pas.
dbenham
5
AVERTISSEMENT: si vous souhaitez utiliser cette solution dans un fichier .bat, vous devez utiliser %% G au lieu de% G, voir ici
ValarDohaeris
18

Comment personne n'a-t-il encore parlé des fichiers forf au PO?!

forfiles /P D:\ /M A* /C "cmd /c if @isdir==TRUE rmdir /s /q @file"

/ P est le nom de chemin - où commence la recherche
/ M est un masque de recherche, à la recherche de fichiers commençant par A
/ C est la commande à exécuter
/ S est des sous-dossiers récursifs (non inclus ici, car op n'a pas demandé)
JJS
la source
2
Ceci est une excellente réponse, devrait être acceptée.
eacousineau
1
Très bonne solution et bien expliquée.
Andreas
Réponse utile: D mais IMO for /dcomme dans and31415 est à la fois plus propre et plus efficace.
Superole
12

adn31415 la réponse est correcte mais casse si vous le mettez dans un script batch ou cmd. Je me suis cogné la tête pendant des heures jusqu'à ce que je comprenne comment vous l'utilisez.

Dans la fenêtre de commande DOS:

for /d %G in ("X:\A*") do rd /s /q "%~G"

En script Batch ou cmd:

for /d %%G in ("X:\A*") do rd /s /q "%%~G"

Si vous voulez le mettre dans un fichier ".bat" ou ".cmd", vous devez doubler les caractères "%".

Sam B
la source
3
Vous avez économisé mon temps pour le script Batch!
Tuan
pas de problème mec :) C'est pourquoi j'ai posté la réponse car je savais que ce n'était pas évident et plus de gens vont s'y heurter.
Sam B
Pouvons-nous ajouter une exclusion à ne pas supprimer?
serdar
SET / P PC = ENTRER IP OU NOM DE L'HÔTE pour / d %% a dans ("\\% PC% \ D $ \ A *. *") Faire rd / s / q "%% a" Cette écriture fonctionne-t-elle correctement ?
serdar