A melhor forma de apagar milhões de arquivos em servidores GNU/Linux

Publicado por Fábio Berbert de Paula em 27/10/2014

[ Hits: 14.726 ]

Blog: https://fabio.automatizando.dev

 


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:
Outras dicas deste autor

Contabilizando Linhas e Palavras de um Projeto com Shell Script

Como restaurar as cores do terminal

Evitando vulnerabilidades em seu servidor NFS

Gmail - Como evitar que emails do VOL sejam bloqueados

O comando man

Leitura recomendada

File slurp em Perl com e sem módulo

Busca em arquivos

Removendo caractere ^M de arquivos com Perl

Apagar somente os arquivos

Nmon - analisando o desempenho do Linux

  

Comentários
[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

[2] Comentário enviado por arkanjo em 07/11/2014 - 03:21h

Sugestão,
Estando dentro do diretorio que se quer limpar
Use

echo *|rm -rf

Uso direto ele pra apagar diretórios com arquivos demais.
É o mais rápido e simples que ja usei.

[3] Comentário enviado por RodrigoKulb em 16/08/2018 - 14:43h

Cara valeu a dica, mas no meu caso estava demorando tanto deixei rodar 3hrs e nada, ai acabei fazendo um programa em PHP para apagar de 100 em 100.

Segue abaixo o exemplo:

<?php
$path = "nomedapasta/";
$diretorio = dir($path);

echo "Lista de Arquivos do diretório '<strong>".$path."</strong>':<br />";
while($arquivo = $diretorio -> read()){
$i++;
if($i>=3)
{
print $arquivo;
print "<br>";
unlink("nomedapasta/".$arquivo);
}
if($i==100)
{
print "<script>
location = 'paginadoscript.php';
</script>";
exit;

}
}
$diretorio -> close();
?>



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts