Debian - excluindo milhares de arquivos

6

Tenho máquina rodando Debian Squeeze com apache, mysql, php ... Em um dos diretórios existem alguns outros dirs e demais arquivos com mais de 500k arquivos, tentei deletar via WinSCP mas ele trava. Mesmo depois de mais de 24 horas, o WinSCP ainda não responde. No momento estou tentando excluir este diretório com Putty (rm -rf dirname), mas assim como o WinSCP, ele não respondeu. Alguma sugestão? Obrigado!

Eu tenho acesso root à máquina.

    
por sklr 06.02.2013 / 15:41

2 respostas

4

A exclusão do diretório deve funcionar. Você pode se deparar com problemas se estiver tentando excluir arquivos individuais porque existem muitos. Você não está executando rm -rf dirname/* você está?

Meu palpite é que você está perdendo a conexão ssh por causa da inatividade, tem certeza de que o comando não foi executado corretamente no servidor?

Em qualquer caso, uma solução possível seria usar nohup :

nohup rm -rf dirname

Você pode iniciar o comando e fazer logoff, ele continuará em segundo plano.

ATUALIZAÇÃO:

Eu encontrei esta pergunta em U & L.SE, eu recomendo que você dê uma olhada nisso. Infelizmente, não posso recriar o seu problema. Eu fiz um diretório com 2516007 arquivos e sempre poderia deletá-lo usando rm -rf :

$ mkdir ha
$ for X in $(seq 1 10000);do touch {1..10000}_$X; done
$ ls -f ha | wc -l 
  2516007     <= I stopped before the for loop finished, but this should be enough
$ time rm -rf ha/
  real  23m11.695s
  user  0m3.540s
  sys           0m42.891s

Então, levou 20 minutos para excluir ~ 2 milhões de arquivos vazios. Parece razoável que possa demorar horas para eliminar uma enorme quantidade de ficheiros não vazios.

De qualquer forma, algumas das sugestões da pergunta U & L devem ajudar. Especificamente este:

find /delb -type f  --delete

ou este (ligeiramente modificado do original)

find /delb -type f -print0 | xargs -0r rm -f

Por fim, um truque que você pode fazer é excluir alguns arquivos de cada vez. Se você sabe que alguns nomes de arquivos começam com a string "foo", outros "bar" etc, faça isso:

rm -rf /delb/foo*
rm -rf /delb/bar*

e assim por diante. Você também pode tentar algo assim:

for n in {a..z}; do rm -rf /delb/$n*; done
for n in {A..Z}; do rm -rf /delb/$n*; done
for n in {0..9}; do rm -rf /delb/$n*; done

Este último comando irá apagar sequencialmente cada nome de arquivo começando com cada letra do alfabeto, então qualquer nome de arquivo começando com números.

    
por 06.02.2013 / 15:47
0

Como um lado não para a resposta já postada. Da minha experiência em lidar com sistemas de arquivos que ficaram sem inodes. Com mais de um bilhão de arquivos no sistema de arquivos.

A maneira mais rápida de excluir / listar arquivos é usando find, especialmente se você tiver milhares de arquivos / diretórios. Find começa a funcionar imediatamente, desde que não haja expansão para fazer.

find /path/to/be/deleted -type f --delete

Não use * ou qualquer outro tipo de expansão de linha de comando como parte de seu comando. * é executado no terminal antes de ser passado para o comando rm / ls, etc. Portanto, seu terminal fica lá tentando listar todos os cem mil arquivos antes de passá-los para o comando real que fará o trabalho. Isso é muito lento.

man bash
...
EXPANSION
Expansion is performed on the command line after it has been split into words. There are seven kinds of expansion performed: brace expansion, tilde expansion, parameter and variable expansion, command substitu‐ tion, arithmetic expansion, word splitting, and pathname expansion.
...

    
por 13.02.2013 / 09:10

Tags