Debian - excluindo milhares de arquivos

6

Eu tenho uma máquina rodando Debian Squeeze com apache, mysql, php ... Em um dos diretórios existem outros diretórios e arquivos demais com mais de 500k, tentei excluir 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 o Putty (rm -rf dirname), mas, assim como o WinSCP, ele não respondeu. Alguma sugestão? Obrigado!

Eu tenho acesso root à máquina.

sklr
fonte
2
Lembre-se, rm não mostra quais arquivos estão sendo excluídos sem o sinalizador -v.
6133 Rob

Respostas:

4

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

Meu palpite é que você está perdendo a conexão ssh devido à inatividade. Tem certeza de que o comando não foi executado corretamente no servidor?

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

nohup rm -rf dirname

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


ATUALIZAR:

Eu encontrei essa pergunta na U & L.SE, recomendo que você dê uma olhada nela. Infelizmente, não consigo recriar seu problema. Criei um diretório com arquivos 2516007 e sempre poderia excluí-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 levar horas para excluir uma enorme quantidade de arquivos não vazios.

De qualquer forma, algumas das sugestões da pergunta de 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

Finalmente, um truque que você pode fazer é excluir alguns arquivos de cada vez. Se você souber que alguns nomes de arquivos começam com a string "foo", outros "bar" etc, faça o seguinte:

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

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

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 excluirá seqüencialmente cada nome de arquivo que começa com cada letra do alfabeto e, em seguida, qualquer nome de arquivo que comece com números.

Terdon
fonte
Outra alternativa seria, screenmas a tela nem sempre é incluída por padrão.
Kruug
Não, eu não estou executando rm -rf dirname/*, tentarei: nohup rm -rf dirnamemas como esse é um servidor de produção, ele prejudicará seu desempenho durante a execução e como posso interrompê-lo se falhar?
Sklr
Isso não deve afetar o servidor (supondo que ele esteja sendo excluído de um disco local). Você pode matá-lo executando killall rmou kill $PIDonde $PIDestá o ID do processo.
terdon
Corri nohup rm -rf dirnameontem (~ 18 horas atrás) e efetuei logoff, agora a pasta ainda existe.
21813 sklr
11
Isso é muito longo, eu verificaria o dmesg e verificaria se o rm está fazendo várias tentativas devido a uma falha no disco.
LtWorf 9/13
0

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

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

encontre / caminho / para / seja / excluído -type f --delete

Não use *ou qualquer outro tipo de expansão de linha de comando como parte do 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
...
EXPANSÃO A
expansão é realizada na linha de comando após ter sido dividida em palavras. Existem sete tipos de expansão executados: expansão de chave, expansão de til, expansão de parâmetro e variável, substituição de comando, expansão aritmética, divisão de palavras e expansão de nome de caminho.
...

nelaaro
fonte