É possível excluir um diretório em tempo constante?

1

Eu geralmente removo um diretório inteiro de uma só vez com rm -rf . Eu notei agora que isso leva mais tempo quanto maior o diretório é (contado recursivamente).

Sistemas unix-like expõem uma maneira alternativa de deletar um diretório que opera em tempo constante? Parece que deve ser possível remover um diretório 'diretamente', sem tocar no conteúdo, que agora está inacessível.

Existe alguma característica dos sistemas de arquivos que o obrigam a percorrer recursivamente o conteúdo de um diretório para excluir o próprio diretório?

    
por Gregory Nisbet 09.02.2017 / 06:12

4 respostas

2

Quando você exclui o diretório, você precisa excluir seu conteúdo recursivamente. Por que isso acontece?

Simplificando, podemos dizer que «diretório» é o arquivo, que contém uma lista de pares. O que acontecerá se você apenas "liberar blocos de diretório em uma unidade"?

Vamos considerar a exclusão de arquivos regulares. Programa (como rm ) chama unlink() chamada do sistema. O sistema de operação (e, mais especificamente, o driver do sistema de arquivos) verifica a contagem de links físicos ( filename no diretório no parágrafo anterior). Se for zero e o arquivo não estiver aberto, ele poderá ser fisicamente excluído. Assim, sabemos como excluir o arquivo.

Agora vamos olhar para a exclusão do diretório novamente. Quando você apenas libera blocos, você não possui unlink arquivos, você não decrementa o contador de links para qualquer arquivo no diretório. E para qualquer arquivo em subdiretórios, subdiretórios, etc. O que é conclusão? Exatamente, precisamos fazer unlink para todos os arquivos no diretório que removemos, porque não queremos obter lixo não removível no Sistema de arquivos.

Assim, você pode usar a solução do @ SYN (rodando rm no background), mas não há como remover o diretório em tempo constante.

    
por 09.02.2017 / 06:51
1

Se o diretório estiver montado em seu próprio sistema de arquivos, você poderá desmontá-lo, recriá-lo com newfs e remontá-lo. Isso levará o mesmo tempo, independentemente do tamanho do diretório.

    
por 09.02.2017 / 22:48
1

Do unix-like systems expose an alternative way to delete a directory that operates in constant time? It seems it should be possible to remove a directory 'directly', without touching the contents at all, which are now inaccessible.

Esta é uma questão de implementação do sistema de arquivos. Agora, a maioria das pessoas que trabalham nos sistemas de arquivos não estão preocupadas muito com o rm -rf performance, porque simplesmente não aparece nas cargas de trabalho do servidor de arquivos e do banco de dados que todos estão tentando otimizar.

Observe que btrfs suporta a extração de uma subárvore em tempo constante - mas você precisa usar um subvolume antecipadamente.

    
por 10.02.2017 / 01:05
0

Uso:

rm -fr /path/to/directory &

Isso embasaria seu comando

Você pode listar tarefas em segundo plano com jobs

Um ID de trabalho seria listado. Que poderia ser usado anexando de volta ao seu processo:

$ sleep 60 &
[1] 22316
$ jobs
[1]+  Running                 sleep 60 &
$ fg %1
sleep 60

Já tendo iniciado seu comando rm , você também pode acessar Ctrl + Z , o que pausaria seu comando e digitaria bg para cancelar a pausa em segundo plano.

Observe que a lista de tarefas que você pode controlar com esses comandos está vinculada ao seu shell - e só pode ser recuperada do shell atual.

    
por 09.02.2017 / 06:38