Utilizzo dei caratteri jolly con il comando rmdir o rd


40

Diciamo che ci sono alcune cartelle nell'unità D::

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

Voglio eliminare tutte le cartelle che iniziano con "A" (comprese tutte le sottocartelle e i file). Ho provato questo comando:

rmdir D:\A* /s /q

Viene visualizzato un errore, tuttavia :(

La sintassi del nome file, della directory o dell'etichetta del volume non è corretta.

Il delcomando funziona con *, ma devo anche eliminare le cartelle.
C'è un modo per raggiungerlo tramite il rmdircomando?


2
L'uniformità e il buon senso non sono mai stati in gioco nello sviluppo delle shell dei comandi di Windows o DOS. La parte triste è che c'erano sistemi modello là fuori quando sono stati sviluppati questi gusci che avrebbero fatto luce su progetti intelligenti. Ovviamente il guscio è solo un esempio del processo di pensiero orribile o inesistente che è andato a schiaffeggiare questa spazzatura: vorrei poterti dire quello che penso davvero, ah ah.
Rick O'Shea,

Risposte:


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

Usa questo per testare però:

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

Questo eseguirà il pipe dei comandi da eseguire nel prompt dei comandi e ti permetterà di vedere cosa sta succedendo.

Tieni presente che questo cercherà anche sottocartelle come "C: \ temp \ jjj \ aaa" e eliminerebbe la cartella aaa. Se vuoi che guardi solo le cartelle di livello superiore "C: \ temp \ aaa", rimuovi il "/s"dal comando.

La chiave di questo è A *, dove inseriresti la tua stringa di ricerca. Questo accetterà caratteri jolly come aaa*, aaa*e *aaa*se lo si desidera.


Così com'è, il comando si interromperà se il nome del percorso / cartella contiene spazi.
and31415

1
Possiamo aggiungere "IF NOT EXIST goto EFO" per A *?
serdar,

3
Funziona se il percorso contiene caratteri spaziali: for / f "delims ="% i in ('dir / a: d / s / b A *') do rd / s / q "% i"
Luis Cantero - MSFT

5
Vorrei solo aggiungere che se si esegue questo da un file batch, è necessario utilizzare i segni del due percento in modo che il comando diventifor /f %%i in ('dir /a:d /s /b A*') do rd /s /q %%i
Fred Clausen,

non c'è bisogno di usare la bandiera 'w / sub' due volte :)
lunicon

25

Eliminazione di cartelle tramite caratteri jolly

Il comando rmdir/ rdda solo non supporta i caratteri jolly (ovvero *e ?). È possibile aggirare questa limitazione avvolgendola in un forciclo.

Esempio di utilizzo

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

Nota Durante l'eliminazione di file e cartelle, è consigliabile sostituire prima il rdcomando echo. In questo modo puoi assicurarti che qualsiasi cosa non debba essere effettivamente eliminata.

Pattern multipli

Per eliminare più cartelle corrispondenti a modelli diversi, la sintassi non è troppo diversa. Come ha sottolineato correttamente @dbenham, è sufficiente un comando di una riga. Puoi anche specificare percorsi diversi:

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

Bonus: controllo dell'esistenza della cartella

Nel caso in cui si desideri verificare l'esistenza di cartelle specifiche, è possibile utilizzare il comando seguente:

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

Ulteriori letture


Possiamo aggiungere "IF NOT EXIST goto EFO" per A *?
serdar,

Ad esempio supponiamo che non vi sia alcuna cartella che inizi con una lettera. Quindi il comando deve andare per B *. Non so se potrei spiegare o meno :(
serdar

1
+1 da me. Non capisco il voto negativo. Sebbene tu possa fare più schemi con i tuoi semplici FOR /De FOR /D /Rcomandi. Basta usare in( "A*" "B*" "C?D" ).
dbenham,

1
In realtà hai bisogno /Rdell'opzione perché la sottocartella che corrisponde alla maschera potrebbe essere sotto un genitore che non lo fa.
dbenham,

5
ATTENZIONE: Se si desidera utilizzare questa soluzione in un file .bat, è necessario utilizzare %% G anziché% G, vedere qui
ValarDohaeris

18

Come mai nessuno ha detto all'OP dei forfile ?!

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

/ P è il percorso - dove inizia la ricerca
/ M è la maschera di ricerca, alla ricerca di file che iniziano con A
/ C è il comando da eseguire
/ S è una sottocartella ricorsiva (non inclusa qui, perché op non ha chiesto)

2
Questa è una risposta eccellente, dovrebbe essere quella accettata.
eacousineau,

1
Ottima soluzione e ben spiegata.
Andreas,

Risposta utile: D ma IMO for /dcome nella risposta di and31415 è sia più pulita che più efficiente.
Superole,

12

La risposta di adn31415 è corretta ma si interrompe se la si inserisce in uno script batch o cmd. Ho sbattuto la testa per ore finché non ho capito che è così che la usi.

Nella finestra di comando DOS:

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

Nello script batch o cmd:

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

Se vuoi inserirlo in un file ".bat" o ".cmd", devi raddoppiare i caratteri "%".


3
Mi hai risparmiato tempo per lo script Batch!
Tuan,

nessun problema amico :) Ecco perché ha pubblicato la risposta perché sapevo che non era ovvio e più persone si imbatteranno in esso.
Sam B,

Possiamo aggiungere un'esclusione da non cancellare?
serdar,

SET / P PC = INSERISCI IP O NOME HOST per / d %% a in ("\\% PC% \ D $ \ A *. *") Do rd / s / q "%% a" Funziona correttamente questo scritpt ?
serdar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.