"Rm -rf" equivalente per Windows?


509

Ho bisogno di un modo per eliminare ricorsivamente una cartella e i suoi figli.

Esiste uno strumento predefinito per questo o devo scriverne uno?

DEL /S non elimina le directory.

DELTREE è stato rimosso da Windows 2000+


1
Del / s (a) non funziona affatto (è disponibile solo in alcune versioni) o (b) lascia la directory di livello superiore ma elimina tutto al suo interno o (c) lascia tutte le directory durante l'eliminazione di tutti i file?
wnoise,

@Aaron, risposta c, è necessario utilizzare rmdir / s per rimuovere directory e file.
Wed

31
Non è davvero format c:quindi l'installazione di Linux? Sto scherzando ovviamente.
Basile Starynkevitch il

Risposte:


694

RMDIR o RD se si utilizza il classico Prompt dei comandi (cmd.exe):

rd /s /q "path"

Percorso RMDIR [/ S] [/ Q] [drive:]

Percorso RD [/ S] [/ Q] [drive:]

/ S Rimuove tutte le directory e i file nella directory specificata oltre alla directory stessa. Utilizzato per rimuovere un albero di directory.

/ Q Modalità silenziosa, non chiedere se ok per rimuovere un albero di directory con / S

Se si utilizza PowerShell è possibile utilizzare Remove-Item(che è alias a del, erase, rd, ri, rme rmdir) e prende un -Recurseargomento che può essere cortocircuitato a-r

rd -r "path"

84
Vale la pena sottolineare che per un gran numero di file, rmdir / s / q è in genere significativamente più veloce dell'equivalente operazione "select dir, shift + delete" in explorer.
Wedge

9
Questo non cancella i file, come fa rm -rf, e restituisce anche un valore diverso da zero quando la directory non esiste, quindi rd /s /q foo && echo "yay"fallirà se la directory "pippo" non esiste.
Dirk Groeneveld,

17
E se dir. non vuoto e alcuni file ottengono Access is deniede altri The process cannot access the file because it is being used by another process?
Eugene,

6
Ho appena provato questo in sette e devi fare / S e / Q (maiuscole)
prefetto ford

2
Mistificato qui. Io so che ho provato questo comando e non ha funzionato se ci fossero file nella directory; ora torno indietro e. . . magicamente sembra funzionare. Qualcun altro ha un comportamento incoerente con questo ?!
Alex Hall,

139

admin:

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

Funziona con qualsiasi cosa, inclusi i file sys

EDIT: In realtà ho trovato il modo migliore che risolve anche il problema del percorso del file troppo lungo:

mkdir \empty
robocopy /mir \empty folder

3
Mio eroe! E un consiglio: crei la tua cartella vuota in C: \ empty, quindi una volta dentro ogni cartella pazza, si può semplicemente farerobocopy /mir c:\empty .
Léon Pelletier,

Il takeownmi ha aiutato come ho copiato cartella dal sistema Linux con rsync per errore e non ho avuto privilegi per rimuovere la cartella ... Nemmeno il robocopy funzionato. Grazie
Jarda,

1
Risposta molto bella. Funziona. (tutte le altre risposte sulla pagina no). Ma Cacls è deprecato. È possibile dare una risposta contemporanea, per favore? La seconda variante funziona già e non è obsoleta.
Gangnus,

Questo non fa nulla per me. Qualcuno potrebbe spiegare come dovrebbe funzionare? (robocopy) - Potrebbe eliminare il contenuto delle cartelle, ma non le cartelle stesse
Ralf

114

RMDIR [/S] [/Q] [drive:]path

RD [/S] [/Q] [drive:]path

  • /S Rimuove tutte le directory e i file nella directory specificata oltre alla directory stessa. Utilizzato per rimuovere un albero di directory.

  • /Q Modalità silenziosa, non chiedere se ok per rimuovere un albero di directory con /S


13
Grazie per la spiegazione dei parametri. La risposta accettata non lo fa purtroppo.
Thomas,

1
La risposta più semplice e perfetta alla domanda. Dovrebbe essere quello accettato.
Artif3x

19

È possibile installare Cygwin, che ha rmcosì come lsecc.


19

Vai al percorso e attiva questo comando.

rd /s /q "FOLDER_NAME"

/ s: rimuove la directory specificata e tutte le sottodirectory, inclusi eventuali file. Usa / s per rimuovere un albero.

/ q: esegue rmdir in modalità silenziosa. Elimina le directory senza conferma.

/? : Visualizza la guida al prompt dei comandi.


9

Per eliminare una directory (che esista o meno) utilizzare quanto segue:

if exist myfolder ( rmdir /s/q myfolder )


6

La risposta accettata è ottima, ma supponendo che tu abbia installato Node, puoi farlo in modo molto più preciso con la libreria di nodi "rimraf", che consente schemi di globbing. Se lo usi molto (lo faccio), installalo a livello globale.

yarn global add rimraf

quindi, ad esempio, un modello che uso costantemente:

rimraf .\**\node_modules

o per un one-liner che ti consente di evitare l'installazione globale, ma che richiede un po 'più di tempo per il download dinamico del pacchetto:

npx rimraf .\**\node_modules

2
Una soluzione solida al problema in quanto indipendente dal sistema operativo.
Denialos

5

Prova questo comando:

del /s foldername

ha funzionato per me in combinazione w / rmdir / s / q poiché alcuni file erano bloccati e rmdir avrebbe fallito su quelli. del / foldername ha cancellato la schermata dei file bloccati che hanno permesso a rmdir di sbarazzarsi della directory principale. Bello.
bbqchickenrobot,


4

Innanzitutto, esaminiamo cosa rm -rffa:

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

Esistono tre scenari in cui rm -rfviene comunemente utilizzato dove dovrebbe tornare 0:

  1. Il percorso specificato non esiste.
  2. Il percorso specificato esiste ed è una directory.
  3. Il percorso specificato esiste ed è un file.

Ho intenzione di ignorare l'intera cosa dei permessi, ma nessuno usa i permessi o cerca comunque di negare l'accesso in scrittura alle cose su Windows (OK, questo è pensato per essere uno scherzo ...).

Innanzitutto impostare ERRORLEVELsu 0 e quindi eliminare il percorso solo se esiste, utilizzando comandi diversi a seconda che si tratti o meno di una directory. IF EXISTnon è impostato ERRORLEVELsu 0 se il percorso non esiste, quindi ERRORLEVELè necessario impostare prima su 0 per rilevare correttamente il successo in modo da simulare il normale rm -rfutilizzo. Proteggere il RDcon IF EXISTè necessario perché RD, diversamente rm -f, genererà un errore se il bersaglio non esiste.

Il frammento di script seguente presuppone che DELPATH sia prequotato. (Questo è sicuro quando fai qualcosa del genere SET DELPATH=%1. Prova a inserire ECHO %1una .cmde passandole una discussione con spazi all'interno e vedi cosa succede per te). Al termine dello snippet, puoi verificare la presenza di errori con 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%

Il punto è che tutto è più semplice quando l'ambiente è conforme a POSIX. O se installi un MSYS minimo e lo usi.



3

Ecco cosa devi fare ...

Creare un file batch con la seguente riga

RMDIR /S %1

Salvare il file batch come Remove.bate inserirloC:\windows

Creare la seguente chiave di registro

HKEY_CLASSES_ROOT\Directory\shell\Remove Directory (RMDIR)

Avviare regedite aggiornare il valore predefinito HKEY_CLASSES_ROOT\Directory\shell\Remove Directory (RMDIR)\default con il seguente valore

"c:\windows\REMOVE.bat" "%1"

Questo è tutto! Ora puoi fare clic con il pulsante destro del mouse su qualsiasi directory e utilizzare la funzione RMDIR


3

Utilizzo di Powershell 5.1

 get-childitem *logs* -path .\ -directory -recurse | remove-item -confirm:$false -recurse -force

Sostituisci i log con il nome della directory che desideri eliminare.

get-childitem cerca la directory children con il nome ricorsivamente dal percorso corrente (.).

remove-item cancella il risultato.


2

Puoi installare GnuWin32 e usare i comandi * nix in modo nativo su Windows. Lo installo prima di installare qualsiasi altra cosa su una nuova copia di menta di Windows. :)


2

UTILIZZARE A PROPRIO RISCHIO. INFORMAZIONI FORNITE "COSÌ COME SONO". NON TESTATO ESTENSIVAMENTE.

Fai clic con il tasto destro sull'icona di Windows (in genere in basso a sinistra)> fai clic su "Windows PowerShell (Admin)"> usa questo comando (con la dovuta attenzione, puoi facilmente eliminare tutti i tuoi file se non stai attento):

rd -r -include *.* -force somedir

Dove si somedirtrova la directory non vuota che si desidera rimuovere.

Si noti che con dischi esterni collegati o dischi con problemi, a volte Windows si comporta in modo strano: non si verifica un errore nell'eliminazione (o in qualsiasi tentativo di copia), tuttavia la directory non viene eliminata (o non copiata) come indicato. (Ho scoperto che in questo caso, almeno per me, il comando dato da @n_y nella sua risposta produrrà errori come 'get-childitem: il file o la directory sono danneggiati e illeggibili.' Come risultato in PowerShell)


1

TARDA MA RISPOSTA IMPORTANTE a chiunque abbia problemi a installare i pacchetti npm sul computer Windows e se viene visualizzato un errore che dice " rm -rf..." comando non trovato. Puoi usare bash cli per eseguire il comando rm su Windows.

per gli utenti di npm, è possibile modificare la configurazione di npm in npm config set script-shell "C:\Program Files\Git\bin\bash.exe"questo modo se il pacchetto npm che si sta tentando di installare ha uno script post installazione che utilizza il rm -rfcomando, sarà possibile eseguire quel rmcomando senza dover cambiare nulla nel pacchetto npm o disabilitare la configurazione degli script post installazione. (Ad esempio, styled-componentsutilizza il rmcomando nei loro script post installazione)

Se vuoi semplicemente usare il rmcomando, puoi facilmente usare bash e passare gli argomenti.

Quindi sì, puoi usare il comando 'rm' su Windows.


0

ecco cosa ha funzionato per me:

Prova a ridurre la lunghezza del percorso. cioè :: Rinomina tutte le cartelle che portano a tale file con i nomi più piccoli possibili. Pronuncia i nomi di una lettera. Continua a rinominare verso l'alto nella gerarchia di cartelle. In questo modo riduci efficacemente la lunghezza del percorso. Ora finalmente prova a cancellare il file immediatamente.



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.