Tenho uma máquina rodando Debian Squeeze com apache, mysql, php... Em um dos diretórios existem alguns outros diretórios e muitos arquivos com mais de 500 mil arquivos, tentei deletar via WinSCP mas travou. 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 responde. Alguma sugestão? Obrigado!
Eu tenho acesso root à máquina.
Responder1
Excluir o diretório deve funcionar. Você pode ter problemas se estiver tentando excluir arquivos individuais porque existem muitos. Você não está correndo, rm -rf dirname/*
está?
Meu palpite é que você está perdendo a conexão ssh por inatividade. Tem certeza de que o comando não foi executado corretamente no servidor?
De qualquer forma, uma solução possível seria usarnada:
nohup rm -rf dirname
Você pode iniciar o comando e fazer logoff, ele continuará em segundo plano.
ATUALIZAR:
eu encontreiessa questãona U&L.SE, recomendo que você dê uma olhada. Infelizmente, não posso recriar seu problema. Criei um diretório com 2516007 arquivos e sempre pude 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
Portanto, foram necessários 20 minutos para excluir cerca de 2 milhões de arquivos vazios. Parece razoável que possa levar horas para excluir uma grande quantidade de arquivos não vazios.
De qualquer forma, algumas das sugestões da questão 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ê sabe que alguns nomes de arquivos começam com a string "foo", outros com "bar" etc, faça o seguinte:
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 excluirá sequencialmente cada nome de arquivo começando com cada letra do alfabeto e, em seguida, todos os nomes de arquivo começando com números.
Responder2
Como um lado não da 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 a ser feita.
encontrar /caminho/para/ser/excluído -type f --delete
Não use *
nenhum 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
...
EXPANSION
A expansão é executada na linha de comando após ser dividida em palavras. Existem sete tipos de expansão realizados: expansão de chaves, expansão de til, expansão de parâmetros e variáveis, substituição de comando, expansão aritmética, divisão de palavras e expansão de nome de caminho.
...