Como o rm -r remove remotamente? Em que ordem?

30

Existe alguma ordem de operações para rm? Eu me apresentei rmem um diretório grande e estou curioso para ver o que pode ter sido excluído. Funciona rmprimeiro nos arquivos e depois nos diretórios? Ou é baseado em algumas informações na tabela de inodes?

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

Histórico:

Eu estava executando alguma limpeza de diretório e executei

cp -r A/ B/ C/ Dest/

Inconscientemente, eu segui isso com

rm -r A/ B/ C/ Dest/

quando eu pretendia simplesmente executar

rm -r A/ B/ C/

Eu peguei isso e apertei Ctrl+ Cantes de passar muito tempo. Especificamente, foram <3 segundos enquanto eu estava usando o timecomando em conjunto com rm& cp. Entrei e examinei Dest/esperando que não existisse, mas eis que estava inteiro e parecia não ser afetado. Isso é um pouco surpreendente, pois A/ B/ C/era bem pequeno. Talvez 100 a 200 MB no total. Dest/no entanto, é apenas tímido de 1 TB. Executar um lson Dest / mostrou que havia arquivos e diretórios nas duas extremidades do alfabeto (por exemplo, AFile.txt.... .... Zoo.txt).

Tive sorte e cancelei o rmantes que causasse estragos no meu diretório Dest /? É rmrealmente tão lento (felizmente!)?

Se não, como rmremover recursivamente coisas que eu possa adivinhar o que pode ter sido perdido?

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

N Klosterman
fonte

Respostas:

34

rm -rtrabalha em cada um de seus argumentos por sua vez. Se um argumento é um diretório, ele lista o diretório (com as funções opendire readdirou 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 outras aplicações utilizar para diretórios transversais de forma recursiva - find, ls -Rf, etc.

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

Observe que lsou echo *classifique os arquivos na ordem lexicográfica de seus nomes. finde ls -fnão classifique.

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

A velocidade de rmé principalmente uma questão de quantos arquivos existem 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 do diretório por vez. Os dados do arquivo não são apagados. A exclusão do conteúdo de um arquivo requer apenas a marcação dos blocos que estava usando como gratuitos, o que é relativamente rápido.

Gilles 'SO- parar de ser mau'
fonte
2
A -fopção de lsestá documentada como sendo equivalente a -aU, onde -asignifica listar todos os arquivos e -Usignifica não classificado. Lembro-me vagamente de ter encontrado uma versão lsem que -fnão funcionou (acho que foi definida como outra coisa), mas -aUfuncionou.
G-Man diz 'Reinstate Monica'
2
@ G-Man POSIX define -f(como uma extensão XSI ); de fato, tem outros efeitos além do não classificado. Ele remonta à V7, então você teria dificuldade em encontrar uma implementação sem ela, além de, estranhamente, o BusyBox. -Upor apenas não classificado é um recurso GNU, acho que não existe em nenhum outro lugar.
Gilles 'SO- stop be evil'
@ Tim Não. Você pode testar executando ls -Uem um diretório. Essa é a mesma ordem que rm -rfuncionaria nesse diretório. Observe que adicionar ou remover um arquivo pode alterar a ordem dos outros arquivos.
Gilles 'SO- stop be evil' em
Obrigado. (1) "adicionar ou remover um arquivo pode alterar a ordem dos outros arquivos". Portanto, após a remoção parcial acidental, ls -Unão ajuda a descobrir se os diretórios sobreviventes estão intocados? (2) -U significa "listar entradas na ordem do diretório". -U significa a ordem das entradas do diretório no diretório?
Tim
5

Como Gilles diz, geralmente não é possível prever a ordem das exclusões em 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 ele excluirá as hierarquias de diretórios de baixo para cima, porque o Unix só permite que os diretórios sejam excluídos se estiverem vazios. Portanto, para excluir um diretório, primeiro é necessário remover tudo nele. Se ele contém subdiretórios, ele deve remover o conteúdo primeiro e assim por diante.

Barmar
fonte