Existe alguma ordem de operações para rm
? Eu me apresentei rm
em um diretório grande e estou curioso para ver o que pode ter sido excluído. Funciona rm
primeiro 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 time
comando 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 ls
on Dest / mostrou que havia arquivos e diretórios nas duas extremidades do alfabeto (por exemplo, AFile.txt
.... .... Zoo.txt
).
Tive sorte e cancelei o rm
antes que causasse estragos no meu diretório Dest /? É rm
realmente tão lento (felizmente!)?
Se não, como rm
remover 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.
Respostas:
rm -r
trabalha em cada um de seus argumentos por sua vez. Se um argumento é um diretório, ele lista o diretório (com as funçõesopendir
ereaddir
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 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
ls
ouecho *
classifique os arquivos na ordem lexicográfica de seus nomes.find
els -f
nã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 queDest/
estava intocado. Se nãoC/
houver mais, você poderá ter uma idéia de onde os arquivos foram removidosDest/
, verificando os horários de modificação do diretório e comparando-os com o tempo queC/
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 emDest/
ou em algum lugar no fundo da hierarquia dependendo se a primeira entradaDest/
querm
aconteceu 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.fonte
-f
opção dels
está documentada como sendo equivalente a-aU
, onde-a
significa listar todos os arquivos e-U
significa não classificado. Lembro-me vagamente de ter encontrado uma versãols
em que-f
não funcionou (acho que foi definida como outra coisa), mas-aU
funcionou.-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.-U
por apenas não classificado é um recurso GNU, acho que não existe em nenhum outro lugar.ls -U
em um diretório. Essa é a mesma ordem querm -r
funcionaria nesse diretório. Observe que adicionar ou remover um arquivo pode alterar a ordem dos outros arquivos.ls -U
nã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?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.
fonte