find … -exec rm {} \;
esegue il rm
comando per ogni file. Anche se l'avvio di un nuovo processo è piuttosto rapido, è comunque molto più lento del semplice atto di eliminare un file.
find … -exec rm {} +
chiamerebbe rm
in batch, che è molto più veloce:paghi il costo dell'esecuzione di rm
una volta per batch e ogni batch esegue molte eliminazioni.
Ancora più veloce è non invocare rm
affatto. Il find
Il comando su Linux ha un'azione -delete
per eliminare un file corrispondente.
find ./cache -type f -mtime +0.5 -delete
Tuttavia, se stai producendo file a una velocità tale che find … -exec rm {} \;
non riesco a tenere il passo, probabilmente c'è qualcosa che non va nella tua configurazione. Se cache
contiene milioni di file, dovresti suddividerlo in sottodirectory per un accesso più rapido.
Prova a utilizzare xargs
:
find ./cache -mtime +0.5 -print0 | xargs -0 rm -f
Spiegazione dell'aggiornamento per @pradeepchhetri
Se usi find
con -exec
, ogni file che find
found chiamerà rm
Una volta. Quindi, se hai trovato un numero enorme di file, ad esempio 10000 file, hai chiamato rm
10000 volte.
xargs
tratterà l'output di find
come argomento del comando a rm
, in modo che xargs fornisca tanti argomenti quanti sono rm
può gestire contemporaneamente, ad esempio rm -f file1 file2 ...
Quindi fa meno chiamate fork, rende il programma più veloce.