Por que a exclusão da linha de comando leva significativamente menos tempo que a partir de uma GUI?

26

Algo em que me perguntei ao excluir uma dúzia de imagens do meu computador: Com um rápido rm -rfcomando no conteúdo do diretório, todas as imagens desapareceram rapidamente. Quando arrasto a mesma dúzia de imagens para uma proibição de reciclagem / lixeira, às vezes leva 10 segundos ou mais.

Agora eu tenho certeza que parte disso vem da sobrecarga da GUI e tal, e parte disso pode ser o fato de o arquivo ainda "existir" de alguma forma se for colocado na lixeira, mas há mais alguma coisa que é responsável por uma disparidade de tempo tão grande ? São "rm" e "delete" apenas esses comandos fundamentalmente diferentes, então estou tentando comparar maçãs e laranjas?

Jordan Plahn
fonte
1
É verdade no Windows também, presumivelmente pelas mesmas razões indicadas abaixo.
Chris H

Respostas:

38

Como você notou com razão, a GUI faz mais do que apenas "excluir" os arquivos.

$ rm -rf 

apenas se repete em pastas, excluindo os arquivos e pastas encontrados lá.

A GUI primeiro examina a árvore inteira para descobrir o que há lá (para saber o quanto precisa fazer para desenhar a barra bonita) e, em seguida, retorna pela árvore novamente, movendo os arquivos do local atual para o local da barra. arquivos de lixeira para sua GUI específica. Essa mudança leva mais tempo, pois é necessário primeiro gerar um novo nome de arquivo exclusivo, vincular o arquivo na pasta lixeira, desvinculá-lo da pasta atual e atualizar um índice de onde os arquivos vieram para que eles possam ser "desfeitos" - muitas operações em vez de apenas uma.

Por exemplo, no Gnome 3, os arquivos são movidos para o local:

~/.local/share/Trash/files/<filename>[.<version>]

Onde filenameé o nome do arquivo original e versioné um número de versão incremental para garantir que o arquivo seja exclusivo (a primeira instância do arquivo não possui número de versão). Associado a isso, há um .trashinfoarquivo armazenado na pasta:

~/.local/share/Trash/info/<filename>[.<version>].trashinfo

Este arquivo contém o caminho original do arquivo antes da exclusão, bem como a data e a hora em que esse arquivo foi excluído.

Todas essas operações extras, que devem ser executadas em todos os arquivos individuais da árvore que você está excluindo, garantem a capacidade de restaurar qualquer arquivo da lixeira e a exclusão de arquivos com o mesmo nome no diretório mesmo local e ainda restaura versões anteriores.

Nada disso é feito com um simples rmou mvcomando.

Majenko
fonte
1
Ei, quem excluiu todos os comentários? Estávamos apenas descobrindo que essa resposta pode estar errada. Pelo menos trash-clinão parece fazê-lo recursivamente. Ao excluir uma pasta, o Gnome 3 realmente coloca um .trashinfoarquivo recursivamente para cada subpasta e todos os arquivos que contêm?
MB21
Acho que ficou muito barulhento para eles! ;-)
Jordan Plahn