A melhor forma de apagar milhões de arquivos em servidores GNU/Linux
Estava com o seguinte problema: servidor de produção e um diretório com 8 milhões de arquivos a serem apagados. E agora, qual a melhor (e
mais rápida) forma de deletar todos estes arquivos?
No meu exemplo o diretório desejado é onde ficam armazenados os arquivos de sessão do PHP:
# cd /var/lib/php5
Alternativa 1 - comando rm
Usando o comando rm:
# rm -Rf *
Aqui, das duas uma. O shell retornará uma mensagem de erro dizendo "argument list too long" ou o servidor demorará uma
eternidade para deletar todos os arquivos de seu filesystem (essa é a forma mais lenta e que mais consome CPU).
Alternativa 2 - comando find
99% dos analistas de suporte que conheço recorrem ao find nessa situação e ele realmente funciona:
# find . -maxdepth 1 -type f -delete
Apesar de ser melhor que o rm, o find ainda consome bastante CPU e demora um bocado pra finalizar a execução.
Alternativa 3 - o bom e velho Perl!
Pois é, a melhor opção neste caso é recorrer ao bom e velho Perl! Além de executar bem mais rápido, consome MUUUUUITO MENOS CPU!!!! Tive a
oportunidade de testar e confirmar isso num servidor de produção.
# perl -e 'for(<*>){((stat)[9]<(unlink))}'
Para maiores informações, assim como comandos para realizar um benchmark e testar por conta própria, veja:
[1] Comentário enviado por sk47 em 28/10/2014 - 16:09h
Dúvida, o comando perl, tem como deletar os subdiretorios?
Cheguei a ler o link que mas não encontrei para por recursivo isso.
O rm por pior que seja ele deleta tudo que estiver no caminho, testei o perl e ele deleta apenas os arquivos que estão na raiz, estava precisando disso para deletar um diretório do sarg que deve ter muitos arquivos