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.268 ]

Blog: https://mestrefabio.com

 


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

MongoDB - adicionar um campo a todos os documentos de uma coleção

Configurando seu SSH para autenticação automática

Enviando mensagem para todos os usuários

Carteira de Bitcoin Electrum no Linux

Emulador WineX 3.1 para Debian

Leitura recomendada

File slurp em Perl com e sem módulo

Busca em arquivos

Removendo caractere ^M de arquivos com Perl

Autenticação e criptografia de senhas usando PHP

Utilize SD cards no Aspire 5050 (com adaptador ENE Technology Inc) no Ubuntu

  

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