Equivalente "rm -rf" per Windows?
Domanda
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+
Soluzione
RMDIR o RD se stai utilizzando il classico prompt dei comandi (cmd.exe):
rd /s /q "path"
Se stai usando PowerShell puoi usare Remove-Item
(che è alias a del
, erase
, rd
, ri
, rm
E rmdir
) e prende a -Recurse
argomento che può essere abbreviato -r
rd -r "path"
Altri suggerimenti
amministratore:
takeown /r /f folder
cacls folder /c /G "ADMINNAME":F /T
rmdir /s folder
Funziona con qualsiasi cosa, inclusi i file sys
MODIFICARE:In realtà ho trovato il modo migliore che risolve anche il problema del percorso del file troppo lungo:
mkdir \empty
robocopy /mir \empty folder
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 è possibile rimuovere un albero di directory con/S
Puoi installare Cygwin, che ha rm
così come ls
eccetera.
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.
Per eliminare una directory (che esista o meno) utilizzare quanto segue:
if exist myfolder ( rmdir /s/q myfolder )
rmdir /S /Q %DIRNAME%
rmdir /s dirnome
Prova questo comando:
del /s foldername
Per prima cosa, esaminiamo cosa rm -rf
fa:
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
Ci sono tre scenari in cui rm -rf
è comunemente usato dove è previsto il ritorno 0
:
- Il percorso specificato non esiste.
- Il percorso specificato esiste ed è una directory.
- Il percorso specificato esiste ed è un file.
Ignorerò l'intera faccenda delle autorizzazioni, ma nessuno usa le autorizzazioni o cerca comunque di negarsi l'accesso in scrittura su cose in Windows (OK, voleva essere uno scherzo...).
Primo impostato ERRORLEVEL
a 0 e poi cancellare il percorso solo se esiste, utilizzando comandi diversi a seconda che si tratti o meno di una directory. IF EXIST
non imposta ERRORLEVEL
a 0 se il percorso non esiste, quindi impostando il file ERRORLEVEL
prima è necessario impostare su 0 per rilevare correttamente il successo in un modo che imiti il normale rm -rf
utilizzo.A guardia del RD
con IF EXIST
è necessario perché RD
, a differenza di rm -f
, genererà un errore se la destinazione non esiste.
Il seguente frammento di script presuppone che DELPATH sia preceduto da virgolette.(Questo è sicuro quando fai qualcosa del genere SET DELPATH=%1
.Prova a mettere ECHO %1
in un .cmd
e passandogli un argomento con degli spazi e guarda tu stesso cosa succede).Una volta completato lo snippet, puoi verificare eventuali 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 è semplicemente conforme a POSIX.Oppure se installi un MSYS minimo e lo usi semplicemente.
Puoi installare GnuWin32 e utilizzare i comandi *nix in modo nativo su Windows.Lo installo prima di installare qualsiasi altra cosa su una nuova copia di Windows.:)
Ecco cosa devi fare...
Creare un file batch con la seguente riga
RMDIR /S %1
Salva il file batch con nome Remove.bat
e inserirlo C:\windows
Crea la seguente chiave di registro
HKEY_CLASSES_ROOT\Directory\shell\Remove Directory (RMDIR)
Lancio regedit
e 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
Utilizzo di PowerShell 5.1
get-childitem *logs* -path .\ -directory -recurse | remove-item -confirm:$false -recurse -force
Sostituire registri con il nome della directory che desideri eliminare.
get-childitem cerca ricorsivamente la directory children con il nome dal percorso corrente (.).
Rimuovi oggetto cancella il risultato.
La risposta accettata è ottima, ma supponendo che tu abbia installato Node, puoi farlo in modo molto più preciso con la libreria del nodo "rimraf", che consente modelli di globbing.Se lo usi molto (lo faccio), installalo a livello globale.
yarn global add rimraf
poi, ad esempio, uno schema che utilizzo costantemente:
rimraf .\**\node_modules
o per una riga che ti consente di evitare l'installazione globale, ma che richiede leggermente più tempo per il download dinamico del pacchetto:
npx rimraf .\**\node_modules
ecco cosa ha funzionato per me:
Prova semplicemente a diminuire la lunghezza del percorso.cioè ::Rinominare tutte le cartelle che portano a tale file con i nomi più piccoli possibili.Di' nomi di una sola lettera.Continua a rinominare verso l'alto nella gerarchia delle cartelle.In questo modo riduci efficacemente la lunghezza del percorso.Ora finalmente prova a eliminare subito il file.
tramite PowerShell
Remove-Item -Recurse -Force "TestDirectory"
tramite il prompt dei comandi
UTILIZZARE A PROPRIO RISCHIO.INFORMAZIONI FORNITE "COSÌ COME SONO".NON TESTATO ESTESA.
Fai clic con il pulsante destro del mouse sull'icona di Windows (solitamente in basso a sinistra) > fai clic su "Windows PowerShell (Admin)" > utilizza questo comando (con la dovuta attenzione, puoi eliminare facilmente tutti i file se non stai attento):
rd -r -include *.* -force somedir
Dove somedir
è la directory non vuota che desideri rimuovere.
Tieni presente che con i dischi esterni collegati o i dischi con problemi, Windows a volte si comporta in modo strano: non genera errori nell'eliminazione (o in qualsiasi tentativo di copia), ma la directory non viene eliminata (o non copiata) come indicato.(Ho scoperto che in questo caso, almeno per me, il comando fornito da @n_y nella sua risposta produrrà errori come 'get-childitem :Il file o la directory è corrotto e illeggibile. " come risultato in PowerShell)
C'è anche deltree se utilizzi una versione precedente di Windows.
Mi piace molto questo sito per trovare comandi:SS64:Del - Elimina file
del /s /q directory da eliminare