it-swarm-eu.dev

Eliminazione di massa di file in Windows

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 sulla directory principale richiede anni. C'è un altro modo per fare la cancellazione in un più veloce modo?

138
aaginor

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

L'eliminazione con Windows Explorer è spazzatura perché spreca un sacco di tempo nell'enumerazione dei file. Solitamente sposto le cose che devo cancellare in C:\stufftodelete e ho un file batch deletestuff.bat su rmdir /s/q C:\stufftodelete. È programmato per funzionare di notte, ma a volte ho bisogno di eseguirlo durante il giorno, quindi più veloce è e meglio è.

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

Il metodo 1 rimuove i file e la struttura di directory in un solo passaggio:

rmdir /s/q foldername

Metodo 2 ha un primo passaggio per eliminare i file e le uscite su null per evitare il sovraccarico di scrittura sullo schermo per ogni singolo file. Un secondo passaggio ripulisce la struttura della directory rimanente:

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

Ecco i risultati di un altro test utilizzando 404 MB di 19.521 file in 3243 cartelle:

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

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


Modifica: ho ripeterlo 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

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

177
Hugo

Se devi eliminare regolarmente grandi alberi di directory, considera la possibilità di archiviare la radice di quell'albero di directory su una partizione separata, quindi semplicemente formattarla rapidamente ogni volta che devi eliminare tutto. Se è necessario automatizzarlo, è possibile utilizzare questo comando DOS:

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

dove Z: è la tua partizione 'volatile'. Nota: la partizione non deve contenere etichette. Ho bloggato su questo qui .

18
Mr. Bungle

Nel comando Prompt (Start -> Esegui -> cmdname__):

del /f /s /q foldername 
9
lmsasu

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

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

La beta che consiglio sulle versioni stable: http://blog.codesector.com/2010/09/22/teracopy-2-2-beta-3/

6
rautamiekka

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 fasi, uno, tenta di cancellare i file. E il secondo è provare ad assumere la proprietà dei file. y dovrebbe essere cambiato secondo il tuo locale (sta per sì in inglese). Se l'operazione non viene eseguita correttamente (ad esempio, in caso di esito negativo, a causa dell'autorizzazione), è necessario eseguirlo di nuovo. Tuttavia, il secondo round non tenterà di eliminare i file eliminati nel primo round, quindi potrebbe essere abbastanza veloce.


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

 delfolder "foldername"   

dove foldername è il nome della cartella

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

6
magallanes

Utilizzare il comando rd/s dal comando Prompt.

3
JP Alioto

Usando il codice qui sotto 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
3
Benoit

La migliore soluzione pratica è probabilmente spostare la cartella da qualche parte (ad esempio il Cestino) e quindi iniziare a eliminarla. Ci vorranno secoli, ma almeno sarà fuori strada.

Sono abbastanza sicuro che il tempo necessario per eliminare tutti questi file è un requisito intrinseco dell'attività, non un'inefficienza nell'implementazione della cancellazione.

2
Ryan Thompson

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

1
CarlF

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

1
MSalters

Hai provato una di queste due app?

Assicurati di impostare il numero di sovrascrivi su 0 se vuoi prestazioni più veloci. Fai questo facendo clic sulle opzioni, quindi modifica il valore nella parte inferiore della finestra di dialogo.

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

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

0
Stephen Kellett

Questo è fornito per complimentare e aumentare le misure adottate nelle risposte precedentemente citate.

I due metodi sopra indicati sembrano abbastanza efficaci, ma determinare le prestazioni sarebbe difficile a meno che non siano messi a confronto con le stesse identiche condizioni:

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

    • Idealmente, aggiungere alcuni meccanismi per prevenire eventuali errori di memorizzazione nella cache dovuti alla recency di un'attività simile.
  • Di seguito sono riportate alcune cartelle di esempio (denominate come dimensioni totali) su cui ho sperimentato ma che non sono state in grado di ottenere risultati/risultati definitivi.

r.bat

rmdir /s/q 3.2G

rd.bat

del /f/s/q 3.3G > nul
rmdir /s/q 3.3G
  • Avrei postato i file di log di output, ma credo che la varianza sia enorme a causa delle dimensioni e della distribuzione di file di 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
0
Alex S

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

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

Informazioni sul file BAT di Magallanes , sii molto attento a takeown e icacls, perché i collegamenti fissi condividono le stesse autorizzazioni e proprietari, quindi se ci sono collegamenti non saturi nella cartella che vuoi rimuovere, usando takeown e icacls cambierà le autorizzazioni e i proprietari dei file al di fuori della cartella.

Utilizzando lo strumento ln.exe è possibile elencare tutti i file collegati all'interno della cartella e sapere se sono collegati a file esterni alla cartella (collegamenti non saturi):

ln.exe --enum foldername > HardlinksList.txt
0
liamZ