2013-03-14 13 views
6

I file caricati dall'utente ogni giorno più di un mese vengono eliminati dal server. I caricamenti degli utenti vengono memorizzati nelle directory di giorno in giorno (ad esempio /var/www/media/2013-03-13), quindi è facile identificare i file/directory che devono essere eliminati.Lotto elimina un numero elevato di file

Problema: L'eliminazione di 100.000 file alla volta rende il server non risponde e richiede molto tempo. (Ubuntu 12.04 con 2x2TB ext4 SATA3 hdd nel software RAID1). Al momento PHP sta facendo exec sul comando find /path/to/dir -maxdepth 1 -name '*' -delete.

Come dividere i file necessari per la cancellazione? Fare un ls impiegherà molto tempo su quelle grandi directory.

La soluzione non deve essere in PHP. Non ha nemmeno bisogno di dividere i file in lotti più piccoli

risposta

2
  1. Trova le directory dei giorni in cui si desidera conservare
  2. Trova le directory di tutti giorni
  3. rimuovere 1. da 2.
  4. rm -rf le directory che si ottiene da 3.

Non sono sicuro se questo è più veloce del metodo, ma evita di elencare esplicitamente tutti i file nelle directory.

+0

Ho provato 'rm -rfv dirname' e' find dirname -maxdepth 1 -print -delete' in modo che entrambi stampino i nomi dei file mentre eliminano. In entrambi i casi, l'elenco dei file eliminati viene trasmesso in streaming su stdout, quindi si blocca lì. 'df' mostra che non vengono più cancellati file .... fino a qualche tempo dopo, vengono mostrati altri file da eliminare, quindi si blocca di nuovo – Nyxynyx

Problemi correlati