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.