Não é possível excluir muitos arquivos de uma só vez no linux

5

Eu executei o seguinte comando, de dentro dessas pastas de log. Mas parece que cada pasta levará tempo infinito.

find . -type f -exec rm -v {} \;

rwxrwxr-x  2 root     root      77881344 Mar 16 03:06 logs.123  
drwxrwxr-x  2 root     root     105709568 Nov 14 20:09 logs_15Nov2011  
drwxrwxr-x  2 root     root       6852608 Aug  1  2011 logs2  
drwxrwxr-x  2 root     root     286191616 Nov  2 08:40 logs_2Nov  
drwxrwxr-x  2 root     root      25206784 Nov 10 04:04 logs_del  
drwxrwxr-x  4 root     root       2686976 Oct  6 01:56 logs_delete  
drwxrwxr-x  2 root     root          4096 May 11  2011 logsMay112011  
drwxrwxr-x  2 root     root      69087232 Aug 29  2011 logs_old  
drwxrwxr-x  7 root     root     382480384 May  9  2011 logs.old905  
drwxrwxr-x  2 root     root          4096 May 11  2011 logsTR1218

Alguma sugestão melhor e mais rápida do que isso para remover todos esses registros?

    
por Vivek Sharma 16.03.2012 / 11:11

5 respostas

6

O GNU find tem a opção -delete, que é sempre segura:

find . -type -f -delete

Como comentado em outro lugar, você pode usar xargs também, mas tenha muito cuidado com o modo como você o usa.

find . -type f -print0 | xargs -0 rm -vf
    
por 16.03.2012 / 12:59
2

Todas as outras respostas assumem que você deseja manter os diretórios, mas não fica claro a partir de sua mensagem original; Além disso, mesmo se você quisesse manter a estrutura, você precisaria remover e recriar os diretórios de qualquer maneira, porque os arquivos do diretório se tornaram muito grandes - eles não encolherão quando você os esvaziar, e seu tamanho irá abrandar maciçamente as operações neles no futuro.

Então você considerou apenas

rm -rf log*
    
por 16.03.2012 / 13:21
1

Se você conseguir gerenciar muitos erros quando o rm não conseguir excluir diretórios, você poderá abordar o problema do outro lado

for dir in $(find . -type d)
do
  rm $dir/*
done
    
por 16.03.2012 / 11:32
0

Tente

find . -type f | xargs rm -vf
    
por 16.03.2012 / 11:34
0

Além de reformatar a partição, não vejo nenhuma maneira mais rápida de excluir todos os arquivos.

O problema é que você tem uma quantidade enorme de arquivos nesses diretórios (o tamanho na saída ls -l que você fornece é enorme!). Para cada rm , o sistema de arquivos deve fazer o seguinte:

  1. Consulta o diretório para inode número,
  2. Atualize o diretório para remover o arquivo dele
  3. Decreta a contagem de links do inode (consulte link físico se você quer saber mais sobre contagem de links),
  4. Se a contagem de links for zero, remova os dados do disco.

Mesmo se você rm do diretório, você só se livra do passo # 2 acima, porque você ainda precisa consultar o diretório e decrementar a contagem de links. Consultar o diretório poderia ser otimizar para obter mais de um número de inode no momento, mas em todos os casos, para cada arquivo a ser excluído, o sistema de arquivos deve verificar o inode para a contagem de links e atualizar o inode (ou marcá-lo para exclusão).

Em outras palavras, esta operação é O(n) do número de arquivos a serem excluídos, o que parece muito grande no seu caso.

Se você não pode formatar sua partição, o que eu acho que é o seu caso ;-), basta iniciar a tarefa em segundo plano ou em um tela e seja paciente.

Outra solução é fazer backup dos arquivos que você deseja manter, formatar a partição e restaurar os arquivos. Talvez seja mais rápido do que excluir todos os arquivos, mas é mais demorado (o find...rm pode ser esquecido em segundo plano por muitos dias, se necessário ...).

    
por 17.03.2012 / 16:09