Eu tinha um dir preenchido com milhões de imagens gif. Muitos para o comando rm.
Eu tenho tentado o comando find assim:
find . -name "*.gif" -print0 | xargs -0 rm
O problema é que ele atrapalha muito minha máquina e causa tempos limite para os clientes, pois é um servidor.
Existe alguma maneira mais rápida de excluir todos esses arquivos ... sem travar a máquina?
rm -rf
seria mais rápido. Vale a pena tentar.Respostas:
Mais rápido não é necessariamente o que você deseja. Você pode realmente executar mais devagar , portanto, a exclusão consome menos recursos enquanto está em execução.
Use nice (1) para diminuir a prioridade de um comando.
Para processos ligados a E / S, nice (1) pode não ser suficiente. O planejador do Linux leva em consideração a E / S, não apenas a CPU, mas você pode desejar um controle mais preciso sobre a prioridade de E / S.
Se isso não acontecer, você também pode adicionar um sono para diminuir a velocidade.
fonte
sleep
adição - eu estava tendo problemas com os servidores engasgando com a entrada / saída, apesar de usarionice -c 3
. Ele faz aumentar significativamente o tempo que leva para limpar os arquivos (é claro), mas eu prefiro esperar do que trazer o baixo aplicação ...Como você está executando o Linux e esta tarefa provavelmente está ligada à E / S, aconselho a dar ao seu planejador a prioridade de E / S inativa usando
ionice(1)
:Comparando com o seu comando original, acho que isso pode até poupar mais ciclos da CPU, evitando o pipe
xargs
.fonte
find ... -exec
lugar que faria sentido.find(1)
documentação afirma que sim. :) E deve ser óbvio que deixar-find
se remover arquivos é mais eficiente do que bifurcar umrm
comando para isso.ionice -c3
reduz o preço para executar apenas quando o IO está ocioso, caso contrário, isso é perfeito. Observe que, como-delete
não é padrão para localização, você pode fazer o mesmo (incluindo o feedback de que funciona) usando este comando:ionice -c 3 find . -name '*.gif' -exec echo {} \; -exec rm {} \;
- Lento, mas sem iowaits de processos importantes.Não.
Não existe uma maneira mais rápida, além do formato suave do disco. Os arquivos são fornecidos para rm de uma só vez (até o limite da linha de comando, também pode ser definido como
xargs
), o que é muito melhor do que chamar rm em cada arquivo. Portanto, não, definitivamente não há caminho mais rápido.O uso
nice
(ourenice
em um processo em execução) ajuda apenas parcialmente, porque é para agendar o recurso da CPU , não o disco! E o uso da CPU será muito baixo. Esta é uma fraqueza do linux - se um processo "consome" o disco (ou seja, trabalha muito com ele), toda a máquina fica presa. O kernel modificado para uso em tempo real pode ser uma solução.O que eu faria no servidor é permitir manualmente que outros processos façam seu trabalho - inclua pausas para manter o servidor "respirando":
Isso aguardará 5 segundos após cada 100 arquivos. Levará muito mais tempo, mas seus clientes não devem notar atrasos.
fonte
rm *
, ele se expande*
para a linha com todos os nomes de arquivos e os passa pararm
? Isso é incrivelmente estúpido. Por que o shell expandir curingas?*
ou/*
e duvidar dessa decisão do usuário.Se o número de arquivos a serem excluídos exceder em muito os arquivos deixados para trás, talvez não seja a abordagem mais eficiente para percorrer a árvore de arquivos a serem excluídos e fazer todas essas atualizações do sistema de arquivos. (É análogo a fazer gerenciamento de memória contado por referência desajeitado, visitar todos os objetos em uma árvore grande para descartar sua referência, em vez de transformar tudo indesejado em lixo em uma etapa e depois varrer o que é acessível para limpar.)
Ou seja, clone as partes da árvore que devem ser mantidas em outro volume. Recrie um sistema de arquivos novo e em branco no volume original. Copie os arquivos retidos de volta aos seus caminhos originais. Isso é vagamente semelhante a copiar a coleta de lixo .
Haverá algum tempo de inatividade, mas poderá ser melhor do que o mau desempenho contínuo e a interrupção do serviço.
Pode ser impraticável em seu sistema e situação, mas é fácil imaginar casos óbvios em que este é o caminho a seguir.
Por exemplo, suponha que você queira excluir todos os arquivos em um sistema de arquivos. Qual seria o sentido de recorrer e excluir um por um? Apenas desmonte e faça um "mkfs" por cima da partição para criar um sistema de arquivos em branco.
Ou suponha que você queira excluir todos os arquivos, exceto os meia dúzia de arquivos importantes? Tire meia dúzia de lá e ... "mkfs" por cima.
Eventualmente, há algum ponto de equilíbrio quando há arquivos suficientes que precisam permanecer, que fica mais barato fazer a exclusão recursiva, levando em conta outros custos, como qualquer tempo de inatividade.
fonte
Você tentou:
O sinal + no final fará com que o find inclua mais arquivos para que o comando rm único seja executado. Verifique esta pergunta para mais detalhes.
fonte
-delete
) o que nem sempre tem que estar lá ..