Existe alguma maneira mais rápida de remover um diretório do que "rm -rf"?

23

Eu tenho uma pasta que tem muitos arquivos e "rm -rf" leva muito tempo para ser concluído. Existe alguma maneira mais rápida de remover um diretório e seu conteúdo (subdiretórios, etc)?

    
por Mohammad Moghimi 22.03.2012 / 02:31

5 respostas

25

Você poderia tentar desvincular o inode do diretório, mas isso deixaria uma carga inteira de arquivos órfãos que fsck irá virar.

rm é o melhor possível.

Algumas pessoas mencionam casos extremos em que algumas coisas são mais rápidas do que outras. Mas vamos nos certificar de que estamos comparando as melhores versões das mesmas coisas.

Se você quiser excluir um diretório e tudo nele, sugiro que você:

rm -rf path/to/directory

rm irá internamente listar os arquivos e diretórios que serão deletados. E isso é tudo em C compilado. São essas duas razões que são mais rápidas.

Isso não é exatamente o mesmo que rm -rf path/to/directory/* , que irá expandir no nível do shell e passar uma carga de argumentos para rm . Então rm tem que analisá-los e depois reciclar de cada um. Isso é muito mais lento.

Assim como um "benchmark" que compara find path/to/directory -exec {} \; é um absurdo. Isso executa rm uma vez por arquivo encontrado. Tão lento. O comando find xargs-style compilação de argumentos com -exec rm {} + , mas é tão lento quanto a expansão. Você pode chamar -delete , que usa uma chamada unlink interna para o kernel (como rm ), mas isso só funcionará para arquivos inicialmente.

Então, para repetir, a menos que você jogue o disco em magma líquido quente, rm é rei .

Em uma nota relacionada, diferentes sistemas de arquivos excluem coisas em taxas diferentes por causa de como estão estruturadas. Se você estiver fazendo isso regularmente, talvez queira armazenar esses arquivos em uma partição formatada no XFS, que tende a lidar com exclusões rapidamente.

Ou use um disco mais rápido. Se você tem toneladas de RAM, usar /dev/shm (um disco RAM) pode ser uma ideia.

    
por Oli 22.03.2012 / 02:48
7

Às vezes, find $DIR_TO_DELETE -type f -delete é mais rápido que rm -rf .

Você também pode experimentar o mkdir /tmp/empty && rsync -r --delete /tmp/empty/ $DIR_TO_DELETE .

Por fim, se você precisar excluir o conteúdo de uma partição inteira, o mais rápido provavelmente será umount , mkfs e re mount .

    
por mivk 12.04.2014 / 15:53
4

Se você não precisar do espaço livre, a maneira mais rápida é atrasar a exclusão e fazer isso em segundo plano:

  • mkdir .delete_me
  • mv big-directory-that-i-want-gone .delete_me

Em seguida, tenha um crontab que o faça em segundo plano, em um momento tranquilo, com uma baixa propensão de E / S:

3 3 * * * root ionice -c 3 nice find /path/to/.delete_me -maxdepth 1 ! -name \. -exec echo rm -rf "{}" +

Notas:

  • verifique sua saída antes de remover o eco no crontab!
  • o diretório .delete_me tem que estar no mesmo sistema de arquivos - no caso de não ser óbvio para todos.

Atualização: Eu encontrei um truque para executar vários rm em paralelo - isso vai ajudar se você tiver uma matriz de disco grande:

ionice -c 3 nice find target_directory -depth -maxdepth 3 | xargs -d \n -P 5 -n 5 rm -rf
  • -depth para fazer uma travessia em profundidade.

  • -maxdepth para limitar a profundidade da travessia do diretório, para que não acabemos ouvindo arquivos individuais.

  • -d \ n para manipular espaços em nomes de arquivos.

  • -P e -n manipulam o grau de paralelismo (consulte manpage).

ref: link

Atualização 2 (2018): Com o ZFS enviado com o Ubuntu 18.04 eu o uso para tudo e vou criar um novo conjunto de dados para qualquer projeto grande. Se você planejar com antecedência e fizer isso de antemão, você pode simplesmente "zfs destruir" um sistema de arquivos quando estiver pronto. ; -)

Eu usei as instruções do wiki zfsonlinux para instalar o Ubuntu no ZFS de forma nativa: link

    
por Lester Cheung 09.03.2016 / 00:12
1

Acho que o problema é que não há uma maneira perfeita de remover um diretório muito grande e todo o seu conjunto de conteúdos sem um verdadeiro sistema de arquivamento indexado que entenda desvincular e não significa que ele tenha arquivos faltando pelo FSCK. Tem que haver uma confiança.

Por exemplo, tenho zoneminder correndo para um campo de golfe. Eu construí um ataque Linux de 1,5 TB para lidar com a imensa quantidade de dados que ela captura um dia (12 feeds de câmera) como ela funcionava em 120 GB de disco está além de mim. Longa história curta a pasta para todos os dados capturados é de cerca de 1,4 TB de seu armazenamento. Muita coisa para limpar

Ter de reinstalar o ZM e limpar a biblioteca antiga de 1,4 TB não é divertido, pois pode levar de um a dois dias para excluir as imagens antigas.

Um FS indexado verdadeiro permite a queda do diretório e sabe que os dados abaixo dele estão mortos e o zerar os dados é um desperdício de tempo e de recursos do PC. Deve ser uma opção para zerar os dados excluídos. RM leva muito tempo no mundo real no ext4.

Resposta: Desligar recursivamente todos os arquivos seria mais rápido marginalmente, mas você ainda teria que reservar um tempo para executar o FSCK.

Crie um script executando um comando "FOR" recursivo que possa "desvincular" todos os arquivos das suas pastas e, em seguida, apenas rm ou rmdir todas as pastas para limpá-lo. Execute manualmente o FSCK para zerar o restante dos dados quando for conveniente. Um pouco preguiçoso não escreveu isso desculpe:).

    
por Adam Lazo 24.06.2012 / 20:00
0

Embora não seja útil se você quer limpar um diretório existente, eu mencionarei que uma estratégia possível se você sabe que terá um diretório com muitos arquivos que você precisará limpar regularmente é colocar o diretório em seu diretório. próprio sistema de arquivos ( por exemplo , partição). Então, quando você precisar limpá-lo, desmontá-lo, executar um mkfs e remontá-lo. Por exemplo O OpenBSD aconselha fazer isso para /usr/obj , onde muitos arquivos são criados durante uma compilação do sistema, e deve ser excluído antes da próxima compilação.

    
por fkraiem 29.03.2016 / 12:17

Tags