Como o rm -r é removido recursivamente? Em que ordem?

29

Existe alguma ordem de operações para rm ? Eu executei rm em um diretório grande e estou curioso para ver o que pode ter sido excluído. O rm funciona nos arquivos primeiro e depois nos diretórios? Ou é baseado em alguma informação na tabela de inodes?

Especificações: rm do GNU coreutils 8.22 sistema: Arch Linux rodando em um beagleboneblack sistema de arquivos operando foi um Seagate HDD (ext4) externo usando USB 2.0.

Histórico:

Eu estava realizando alguma limpeza de diretório e executei

cp -r A/ B/ C/ Dest/

Sem querer, eu segui isso com

rm -r A/ B/ C/ Dest/

quando pretendia simplesmente executar

rm -r A/ B/ C/

Eu peguei isso e apertei Ctrl + C antes de passar. Especificamente, foi < 3 segundos enquanto usava o comando time em conjunto com rm & %código%. Eu entrei e examinei cp esperando que fosse inexistente, mas eis que era todo e apareceu para não ser afetado. Isso é um pouco surpreendente, pois Dest/ A/ B/ eram bem pequenos. Talvez 100-200 MB no total. C/ , no entanto, é pouco mais de 1TB. A execução de um Dest/ em Dest / mostrou que havia arquivos e diretórios nas duas extremidades do alfabeto (por exemplo, ls .... .... AFile.txt ).

Eu tive sorte e cancelei o Zoo.txt antes de causar estragos no meu diretório Dest /? É rm realmente lento (felizmente!)?

Se não, como o rm recursivamente remove coisas de modo que eu possa adivinhar o que pode ter sido perdido?

Eu não estou realmente esperando recuperar o que eu poderia ter perdido, apenas curioso sobre o que potencialmente foi perdido.

    
por N Klosterman 13.10.2014 / 03:28

2 respostas

33

rm -r funciona em cada um dos seus argumentos. Se um argumento for um diretório, ele listará o diretório (com o opendir e readdir funciona ou algum método equivalente), e opera em cada entrada por vez. Se uma entrada é um diretório, ela explora essa entrada recursivamente.

Este é exatamente o mesmo método que outros aplicativos usam para percorrer diretórios recursivamente - find , ls -Rf , etc.

A ordem do percurso é imprevisível. Na maioria dos sistemas de arquivos, a ordem é reproduzível desde que nenhum arquivo seja adicionado, removido ou renomeado no diretório (a ordem poderia, em teoria, ser completamente aleatória e mudar a cada vez, mas não consigo pensar em um sistema de arquivos onde isso acontece). Em alguns sistemas de arquivos, a ordem pode, em geral, ser deduzida dos nomes dos arquivos ou da ordem em que os arquivos foram criados ou de uma combinação de ambos, mas você precisa conhecer os detalhes do sistema de arquivos, e isso pode variar dependendo a versão do driver. A ordem de travessia não é algo em que você possa confiar.

Observe que ls ou echo * classificam os arquivos na ordem lexicográfica de seus nomes. find e ls -f não ordenam.

A única coisa em que você pode confiar é que os argumentos são tratados em ordem. Então, se C/ ainda estivesse parcialmente lá, isso significaria que Dest/ estava intocado. Se C/ desaparecer, você poderá ter uma ideia de onde os arquivos foram removidos em Dest/ verificando os horários de modificação do diretório e comparando-os com o tempo em que C/ foi excluído ou a hora em que a cópia foi finalizada. O primeiro arquivo a ser excluído pode ser um arquivo diretamente em Dest/ ou em algum lugar no fundo da hierarquia, dependendo de a primeira entrada em Dest/ que rm ter atravessado ser um diretório ou não.

A velocidade de rm é principalmente uma questão de quantos arquivos há para excluir. É preciso um arquivo muito grande para ter um impacto perceptível no tempo de exclusão. A maior parte do trabalho está excluindo cada entrada de diretório. Os dados do arquivo não são apagados, apagar o conteúdo de um arquivo requer apenas marcar os blocos que ele estava usando como gratuitos, o que é relativamente rápido.

    
por 13.10.2014 / 03:43
5

Como diz Gilles, geralmente não é possível prever a ordem das exclusões dentro de um diretório, apenas que os diretórios de nível superior serão processados na ordem na linha de comando.

No entanto, você também tem a garantia de que excluirá hierarquias de diretório de baixo para cima, porque o Unix permite que os diretórios sejam excluídos apenas se estiverem vazios. Portanto, para excluir um diretório, primeiro é necessário remover tudo nele. Se ele contiver subdiretórios, ele terá que remover o conteúdo primeiro, e assim por diante.

    
por 15.10.2014 / 21:52

Tags