A melhor forma de apagar milhões de arquivos em servidores GNU/Linux
Dica publicada em Perl / Manipulação de Arquivos
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
# 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).
# 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.
# perl -e 'for(<*>){((stat)[9]<(unlink))}'
Para maiores informações, assim como comandos para realizar um benchmark e testar por conta própria, veja:
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:
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