Eliminazione di massa di file in Windows


141

Ho una directory che contiene ~ 3 milioni di file in alcune sottodirectory su un server Windows 2008. L'eliminazione manuale dei file tramite MAIUSC + CANC nella directory principale richiede secoli. Esiste un altro modo per eseguire la cancellazione in modo più rapido ?


1
Anche chiesto qui su Stack Overflow: stackoverflow.com/questions/186737/…
Hugo

6
Come potrei indirizzare il magnete solo su alcune sottodirectory?
Jaime Hablutzel,

7
@Jaime con mano ferma, come un vero programmatore ... ;-) xkcd.com/378
Legionair

E se si tratta di un'unità SSD?
Benjamin Weiss,

Risposte:


179

ATTENZIONE: se si dispone di collegamenti simbolici alle directory, delverranno eliminate le directory effettive e non i collegamenti simbolici. Fai molta attenzione e non eseguire questi comandi a meno che tu non sappia che non ci sono collegamenti simbolici nella directory di destinazione.


Ho regolarmente bisogno di eliminare molti file e directory da un'unità crittografata WinXP, in genere circa 22 GB di 500.000 file in 45.000 cartelle.

L'eliminazione con Esplora risorse di Windows è spazzatura perché spreca molto tempo a elencare i file. Di solito sposto le cose che devo cancellare in C: \ stufftodelete e ho un file batch deletestuff.bat in rmdir /s/q C:\stufftodelete. Questo è programmato per funzionare di notte, ma a volte ho bisogno di eseguirlo durante il giorno, quindi più veloce è, meglio è.

Ecco i risultati di un rapido test di tempo di un piccolo campione di 5,85 MB di 960 file in 303 cartelle. Ho eseguito il metodo 1 seguito dal metodo 2, quindi ho ripristinato le directory di test.

Il metodo 1 rimuove i file e la struttura delle directory in un unico passaggio:

rmdir /s/q foldername

Il metodo 2 ha un primo passaggio per eliminare i file e l'output a zero per evitare il sovraccarico di scrivere sullo schermo per ogni singolo file. Un secondo passaggio quindi pulisce la struttura di directory rimanente:

del /f/s/q foldername > nul
rmdir /s/q foldername
  • Metodo 1: 17.5s, 14.9s, 13.9s, 14.8s, 13.8s: media 14.98 secondi
  • Metodo 2: 14.3s, 12.1s, 11.7s, 14.2s, 11.8s: media 12.82 secondi

Ecco i risultati di un altro test che utilizza 404 MB di 19.521 file in 3.243 cartelle:

  • Metodo 1: 2 minuti e 20 secondi
  • Metodo 2: 2 minuti 33 secondi

Quindi non c'è molto in esso, probabilmente troppo vicino per giudicare in un singolo test.


Modifica: ho eseguito nuovamente il test con molti più dati, questo è un caso tipico per me: 28,3 GB di 1.159.211 file in 146.918 cartelle:

  • Metodo 1: 2h 15m, 2h 34m: media: 2 ore 25 minuti
  • Metodo 2: 49m, 57m: media: 53 minuti

Caspita, il metodo 2 è quasi tre volte più veloce del metodo 1! Aggiornerò il mio deletestuff.bat!


RD / S / Q funziona alla grande se si specifica un percorso assoluto ma non funziona quando si lavora con percorsi relativi. C'è una soluzione?
Michael S.

1
@Hugo: Hugo, una domanda: nei test temporizzati sopra, per uno o entrambi i metodi, hai contato i file immediatamente prima di eseguire il metodo? Sto chiedendo perché il contenuto della cartella potrebbe già essere nella cache del file del sistema operativo. Grazie!
William C,

@WilliamC: non ricordo esattamente, ma per le ripetute cancellazioni con gli stessi contenuti avrò contato immediatamente prima di una sola cancellazione e non le avrei ripetute per le altre cancellazioni (poiché conoscevo già i numeri).
Hugo,

1
Sia rmdir che del falliscono quando sono coinvolti percorsi più lunghi di 256 caratteri.
Nicolai Ehemann,

1
ATTENZIONE: se si dispone di collegamenti simbolici alle directory, delverranno eliminate le directory effettive e non i collegamenti simbolici. Fai molta attenzione e non eseguire questi comandi a meno che tu non sappia che non ci sono collegamenti simbolici nella directory di destinazione.
user0103

18

Se devi eliminare regolarmente alberi di directory di grandi dimensioni, considera di archiviare la radice dell'albero di directory in una partizione separata, quindi formattala rapidamente ogni volta che devi eliminare tutto. Se è necessario automatizzare questo, è possibile utilizzare questo comando DOS:

echo Y | format Z: /FS:NTFS /X /Q

dove Z: è la tua partizione "volatile". Nota: la partizione non deve avere etichetta. Ho scritto un blog su questo qui .


E utilizzare un collegamento fisico per creare una connessione tra il disco e la directory in cui sono memorizzati i file se è necessario il percorso esatto della directory.
Nime Cloud,

1
@NimeCloud: i collegamenti fisici non possono attraversare filesystem o directory di collegamenti.
Grawity,

5
Tuttavia, i collegamenti simbolici possono attraversare filesystem e directory di collegamenti, quindi potrebbero essere appropriati qui. Vedi il comando mklink (Vista e versioni successive; altrimenti usa la giunzione di Mark Russinovich / SysInternals.)
Robert Calhoun,

9

Nel prompt dei comandi (Start -> Esegui -> cmd):

del /f /s /q foldername 

Questo è fantastico perché elenca ciò che sta eliminando .. ma è lo stesso del secondo in termini di velocità.
bobobobo,

1
Oh woah woah woah. Non buono come pensavo. Elimina rapidamente i file ma lascia intatto l'albero delle directory.
bobobobo,

1
Che potrei aggiungere impiega molto tempo a chiarire usando rd.
Bobobobo,

3
@bobobobo Ho fatto alcuni test con ~ 30 GB / 1.000.000 di file / 15.000 cartelle e del + rd è quasi tre volte più veloce di solo rd: superuser.com/questions/19762/mass-deleting-files-in-windows/…
Hugo

1
Ciò fallirà se il percorso è più lungo di 256 caratteri.
Nicolai Ehemann,

7

Oltre a copiare / spostare file molto velocemente (usando la propria API), TeraCopy può eliminare file ed è anche molto veloce. Da quando ho scoperto TeraCopy non uso un computer senza averlo installato (se ho intenzione di copiare / spostare / eliminare).

Lo stesso programma di installazione installa l'edizione x64 ma per usarlo devi forzarlo manualmente.

La beta che raccomando rispetto alle versioni stabili: http://blog.codesector.com/2010/09/22/teracopy-2-2-beta-3/


Hai mai fatto o visto paragoni di tempo simile a quello di TeraCopy vs rmdir o del o del + rmdir?
Hugo,

1
@Hugo: domanda stupida. Non consiglierei TeraCopy se non fosse visibile ad occhio nudo è più veloce!
rautamiekka,

5
Quindi stima che sia il 10% più veloce? Due volte più veloce? Dieci volte più veloce? Un milione di volte più veloce? Sarebbe bello se potessi cronometrarlo con rmdir con due set di test grandi e identici.
Hugo,

1
Grazie! Uso TeraCopy da anni, ma non ho mai saputo della funzione di eliminazione di massa. E hai ragione, è molto, MOLTO più veloce!
AzDayton,

1
@Amalgovinus No. Puoi aprire il programma e aggiungere file / cartelle trascinandoli o facendo clic con il pulsante destro del mouse oppure facendo clic con il pulsante destro del mouse su file / cartelle in Explorer / sul desktop. Una volta terminato di seguirli, fai clic su "Elimina" e "Sposta nel cestino" se lo desideri, ma preferisco "Elimina dal disco". Tuttavia, dovrai avviare TeraCopy come amministratore per configurarlo per visualizzarlo nel desktop / Explorer facendo clic con il tasto destro del mouse se non viene eseguito per impostazione predefinita.
rautamiekka,

6

Ho fatto un file bat che fa lo stesso.

@echo off
echo --------------------WARNING--------------------
echo folder "%~1" will be deleted
echo --------------------WARNING--------------------
pause
echo Deleting folder: "%~1".
time /T
del /f/s/q "%~1" >nul
rmdir /s/q "%~1" >nul
echo Done.
time /T
echo --- Taking ownership.
takeown /f "%~1" /r /d y >nul
icacls "%~1" /reset /t >nul
icacls "%~1" /setowner "%username%" /t >nul
echo Done all.
time /T

fa il lavoro in due passaggi, uno, tenta di eliminare i file. E il secondo è provare a prendere la proprietà dei file. y dovrebbe essere cambiato in base al proprio locale (indicare sì in inglese). Se fallisci l'attività (ad esempio se fallisci a causa dell'autorizzazione), devi eseguirla di nuovo. Tuttavia, il secondo round non tenterà di eliminare i file eliminati nel primo round, quindi potrebbe essere piuttosto veloce.


Come usarlo. Salvare come delfolder.bat in un percorso (ad esempio c: \ windows), quindi eseguirlo come

 delfolder "foldername"   

dove foldername è il nome della cartella

Nel mio test, l'eliminazione di 123'000 file ha richiesto 3 minuti (sata 7200rpm). SÌÌ!


1
Di solito non dovresti usarlo %1in uno script, ma "%~1". In questo modo, se l'argomento è stato passato tra virgolette, viene quotato e rielaborato. Se non è stato passato tra virgolette, viene quotato.
Benoit il

4

L'uso del codice seguente di solito funziona bene per me.

mkdir empty_dir
robocopy empty_dir dir_to_wipe /mir /r:0 /w:0 /e
rmdir empty_dir dir_to_wipe

Aggiungi un `> nul` alla fine di quella chiamata robocopy in modo da non vederlo sullo schermo.
JoshDM,

È simile all'uso di rsyncin Linux. È anche qui più veloce allora rmdir?
Hastur,

Cordiali saluti, questo robocopy è molto diverso da del /f/q/s+ rmdir /s/q. Se dir_to_wipe ha dei junktions, finirai per c:\some_important_dirperdere i tuoi dati.
Pavel P,

@Pavel quindi utilizzare / XJ per escludere punti di giunzione e collegamenti simbolici?
Bernhard

Questo ha fatto il trucco per una directory di ~ 36 GB che aveva centinaia di directory e file che erano> 256 caratteri causando miseramente il "metodo" del / rmdir. Ci vollero pochi secondi, Windows Explorer stimava ORE!

3

Utilizzare il comando rd / s dal prompt dei comandi.


2
No. È lento quanto l'eliminazione da Explorer.
bobobobo,

Va bene. Funziona meglio di del / f / s / q, comunque.
Bobobobo,

3
Bene, questo è MOLTO meglio che usare Explorer per cancellare, in realtà. Continua a cancellare, anche se una o due eliminazioni falliranno (dove Explorer esplora e si interrompe)
bobobobo

2

La migliore soluzione pratica è probabilmente quella di spostare la cartella da qualche parte (ad esempio il Cestino) e quindi iniziare a cancellarla. Ci vorranno anni, ma almeno sarà fuori dai piedi.

Sono abbastanza sicuro che il tempo necessario per eliminare tutti quei file sia un requisito intrinseco dell'attività, non un'inefficienza nell'implementazione dell'eliminazione.


1

Installa Cygwin e usa rm -r . Ma è probabile che sia eccessivo.


È esattamente lo stesso di rd /q /s...
Joey,

Troppo compito e velocità quasi equivalente!
adeelx,

1
Non è peggio delle altre risposte install-tool-X-and-use-qui e non dovrebbe essere votato se non lo sono.
JdeBP,

2
Cygwin è rmveramente veloce come incorporato cmd.exe rd? Poiché l'emulazione cygwin dell'interfaccia posix è piuttosto lenta in quanto richiede un lavoro extra, questo rmnon lo apprezza.
Jan Hudec,

In attesa di una grande raccolta di file da eliminare, ho avuto abbastanza tempo per installare Cygwin e provare rm -rf. Circa 10 minuti dopo ho interrotto e sono tornato a del /f/s/qperché in Cygwin, l'utilizzo del disco era solo del 50%. Sotto del, l'utilizzo del disco è ancorato al 100%. Quindi immagino che debba essere cancellato più velocemente. L'utilizzo della CPU è <1% per entrambi i metodi. Non sono sicuro del numero di file perché ho chiuso il File Deleter di Windows dopo aver trascorso 10 minuti nel calcolo.
Derek Ziemba,

1

Hai abilitato la generazione di nomi di file brevi? Se è così, ne hai davvero bisogno? La rimozione di un file è solo un'opzione dei metadati. Quindi, se hai il doppio del numero di nomi da rimuovere, la quantità di lavoro è significativamente più alta.


0

Hai provato una di queste due app?

Assicurati di impostare il numero di sovrascritture su 0 se desideri prestazioni più veloci. Fallo facendo clic su opzioni, quindi modifica il valore nella parte inferiore della finestra di dialogo.

Immettere il percorso da eliminare nel campo Origine, quindi fare clic su Elimina.

Queste app non inseriscono i file nel cestino. Usare con cura.


0

Questo viene fornito per complimentarmi e aumentare le misure prese nelle risposte precedentemente menzionate.

I due metodi sopra indicati sembrano abbastanza efficaci, ma per determinare le prestazioni sarebbe difficile se non fossero confrontati con le stesse identiche condizioni:

  • Dispositivo e modello del disco rigido fisico
    • Preferibilmente, ATTO / Crystal Disk ha effettuato un benchmark prima di clonare i dati su di essi
  • Stessa partizione / posizione e geometria del volume
    • Il modo per farlo sarebbe di deframmentare le partizioni / cartelle di esempio e clonarle esattamente perché sono esattamente gli stessi 2 tipi di dischi rigidi (dal passaggio precedente)
  • Quindi eseguire le configurazioni tramite Batch File e utilizzare Powershell Cmdlet per registrare e misurare le loro prestazioni.

    • Idealmente, aggiungi alcuni meccanismi per prevenire errori di cache dovuti alla recency di attività simili.
  • Di seguito sono riportate alcune cartelle di esempio (denominate come dimensione totale) su cui ho sperimentato ma non sono stato in grado di ottenere prestazioni / risultati conclusivi.

r.bat

rmdir /s/q 3.2G

rd.bat

del /f/s/q 3.3G > nul
rmdir /s/q 3.3G
  • Avrei pubblicato i file di log di output, ma credo che la varianza sia enorme a causa delle dimensioni e della distribuzione dei file delle cartelle, ecc.

PowerShell:

PS S:\T> Measure-Command { S:\T\rd.bat } > rdlog.txt

PS S:\T> Measure-Command { S:\T\r.bat } > rlog.txt

PS S:\T> Measure-Command { S:\T\rd.bat } > rd_1.7G_log.txt

PS S:\T> Measure-Command { S:\T\r.bat } > r_1.8G_log.txt

PS S:\T> Measure-Command { S:\T\r.bat } > r_2.4G_log.txt

PS S:\T> Measure-Command { S:\T\rd.bat } > rd_2.7G_log.txt

PS S:\T> Measure-Command { S:\T\r.bat } > r_3.2G_log.txt

PS S:\T> Measure-Command { S:\T\rd.bat } > rd_3.3G_log.txt

fallisce con nomi> 256 caratteri

0

La risposta di Hugo è la più veloce ma non rimuove i file nascosti o di sistema al primo passaggio, quindi se vuoi una soluzione più completa usa il parametro / a:

del /f /s /q /a foldername > nul
rmdir /s /q foldername

A proposito del file BAT di Magallanes , fai molta attenzione a takeown e icacls, perché gli hardlink condividono gli stessi permessi e proprietari, quindi se ci sono hardlink insaturi nella cartella che vuoi rimuovere, usando takown e icacls cambieranno le autorizzazioni e i proprietari dei file all'esterno la cartella.

Utilizzando lo strumento ln.exe è possibile elencare tutti i file collegati alla cartella all'interno della cartella e sapere se sono collegati ai file all'esterno della cartella ( collegamenti fissi insaturi):

ln.exe --enum foldername > HardlinksList.txt

-1

L'eliminazione della cartella è più rapida dell'eliminazione di più file.

Quindi, se preferisci usare il mouse invece del prompt dei comandi, puoi creare una directory, spostare i file lì ed eliminarlo (con Shift + Canc come hai detto).


2
La directory deve essere creata sulla stessa partizione in cui risiedono i file. Ciò renderà l'azione di movimento istantanea. Se la nuova cartella e i file si trovano su partizioni separate, l'intera operazione di copia durerà molto.

5
Dove ti viene l'idea che eliminare una cartella è più veloce dell'eliminazione dei file all'interno? L'eliminazione di una cartella contiene come primo passo l'eliminazione di tutti i file in quella cartella, quindi non può essere più veloce. Passare al cestino è una questione completamente diversa, ma non è questa la domanda.
Joey,
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.