Por que MV (1) copia objetos se a permissão para mover é negada?

7

O mv age como cp(1) se a permissão do processo for movido negada?

Se sim, não é contra a regra fazer uma coisa e fazê-lo bem?

    
por rich 25.08.2014 / 08:00

1 resposta

15

A resposta curta é que isso não acontece.

mv está definido para:

perform actions equivalent to the rename() function

rename() não copia conteúdo, simplesmente o renomeia no disco. É uma operação completamente atômica que nunca falha parcialmente completa.

Isso não conta toda a história, no entanto. Onde esse efeito pode acontecer é ao tentar mover um arquivo entre dispositivos: nesse caso, não é possível fazer a renomeação no sistema de arquivos. Para ter o efeito de mover, mv primeiro copia a origem para o destino e, em seguida, exclui a origem. Com efeito, mv /mnt/a/X /mnt/b/Y é essencialmente equivalente a cp /mnt/a/X /mnt/b/Y && rm /mnt/a/X . Essa é a única maneira de mover arquivos entre dispositivos poderia funcionar.

Quando mv não tiver permissão para excluir o arquivo de origem, um erro será relatado, mas a cópia já ocorreu. Não é possível evitar isso verificando as permissões antecipadamente devido a possíveis condições de corrida nas quais as permissões são alteradas durante a operação.

Não há realmente nenhuma maneira de evitar essa possível eventualidade, além de impossibilitar a movimentação de arquivos entre dispositivos. A escolha de permitir mv entre qualquer origem e destino torna as coisas mais simples no caso geral, às custas do comportamento estranho (mas não destrutivo) nesses casos incomuns.

É também por isso que mover um arquivo grande em um único dispositivo é muito mais rápido do que movê-lo para outro.

    
por 25.08.2014 / 08:12