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?


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.


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


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é)

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


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