É melhor sempre copiar e excluir, em vez de mover?

16
De modo geral, fico em pânico quando percebo que, se eu cancelar uma mudança de arquivo, isso poderia fazer com que o alvo ou a fonte ficasse incompleta. Esta questão se aplica a plataformas baseadas em Windows e Unix. Eu nunca consigo lembrar exatamente como o comando move funciona em ambos os casos. Por exemplo, se você estiver movendo um diretório; copia todo o diretório e depois o exclui depois ou copia e exclui cada arquivo individualmente?

Eu sempre percebo, depois de digitar algo como mv verybigdir dest , que talvez eu devesse ter digitado cp -R verybigdir dest  &&  rm -R verybigdir (onde o operador && prossegue para o próximo comando apenas se o primeiro for bem-sucedido) - ou isso é inútil? O que acontece, exatamente, quando pressiono Ctrl + C na metade de um movimento? Da mesma forma, o que exatamente acontece no Windows quando pressiono o botão Cancelar?

Não consigo contar o número de vezes que movi algo (a última vez que usei svn ) e tinha dois diretórios, com o conteúdo dividido. Eu acho que a resposta é difícil, porque nem todos os aplicativos movem grupos de arquivos da mesma maneira.

    
por Nick Bolton 12.01.2010 / 19:44

7 respostas

10

No Windows, mover para a mesma unidade e partição funcionará como o comando mv do Unix e renomear a pasta ou alterar seu pai. No entanto, se você fosse movê-lo para outro driver ou partição, ele copiaria e excluiria arquivo por arquivo, e por isso é mais eficiente usar um arquivo tar ou um arquivo zip sem compactação para mover arquivos mais rapidamente em partições e discos rígidos . Se você fosse cancelar, simplesmente pararia onde está. Eu acredito que o mesmo é verdade para o Unix, mas eu não experimentei o suficiente para ter 100% de certeza. É apenas uma questão de mudar o inode, mas se estiver em outra partição ou unidade, então ele precisa ser copiado para setores nessa partição ou unidade. Se você fosse cancelá-lo durante a transferência, ele já teria movido alguns arquivos, e o arquivo que estava sendo transferido veria seu arquivo de destino removido eo arquivo de origem mantido (transação cancelada, mas seu arquivo original ainda existe).

Atualização: se você cancelasse uma mudança e quisesse retomar, apenas reenvie a ordem para a mudança. Ele pode avisá-lo que a pasta de destino já existe, mas os arquivos não serão sobrescritos (a menos que tenham existido antes da movimentação original ou tenham sido adicionados entre as duas ordens de movimentação), pois assim que forem transferidos, serão excluídos da source (se estiver em uma partição ou drive diferente).

    
por 12.01.2010 / 21:32
11

Mesmo em um computador perfeitamente estável que nunca falha: se você se preocupa com carimbos de data e hora, então mv é melhor que cp .

( cp -a irá preservar os timestamps para você, e eu assumo que algo similar existe no Windows).

    
por 12.01.2010 / 20:01
9

Não.

Explicação:

mv verybigdir dest

renomeia muitobigdir para dest. Esta é uma operação atômica, ou seja, não pode falhar na metade.

Se dest estiver em outro dispositivo, o mv copiará primeiro e depois excluirá a versão antiga. Esta não é uma operação atômica. Se falhar, você pode ter apenas uma cópia parcial do muitobigdir em dest, mas o verybigdir ainda estará completo.

Sim, outros aplicativos podem mover arquivos de maneira diferente.

    
por 12.01.2010 / 19:57
4

No Windows eu sempre copio e excluo ao invés de mover. Uma vez eu estava movendo arquivos e é aí que eu notei um pau ruim de memória. Ao mover o arquivo parou no meio e eu tenho um erro assim que eu verifiquei a pasta de origem e o arquivo foi ido, então eu verifiquei o destino e havia um arquivo corrompido. Isso aconteceu mais frequentemente com arquivos de tamanho maior e a maioria deles eram downloads, o que levou horas para que o código recomendasse a cópia e a exclusão. Poupe tempo no começo, no final, valerá a pena.

    
por 12.01.2010 / 19:58
3

No unix, em movimentos que não cruzam os limites do sistema de arquivos, mv não copia os dados: apenas atualiza o banco de dados do inode em vários diretórios. Isso é muito mais rápido que cp em arquivos grandes.

Além disso, usar mv nos limites do sistema de arquivos invoca silenciosamente um mecanismo de cópia e exclusão.

Então, eu acho que você deve preferir mv .

    
por 12.01.2010 / 21:28
2

No Windows, pelo menos, mover é simplesmente uma Cópia e exclusão mais automatizada. Acredito que o mv move cada arquivo individualmente, o que significa que o ^ c-ing não perderá nenhum arquivo, você acabará com seus arquivos divididos entre dois locais - ao contrário do Windows Explorer, que desativa tudo quando é cancelado.

Minha solução para isso é: nunca mova, a menos que tenha certeza de que quero movê-lo.

    
por 12.01.2010 / 19:51
1

Se você estiver usando ACLs no sistema de arquivos de origem, mas não no destino, o mv no Linux copiará a origem e, em seguida, devido à incapacidade de definir as ACLs no destino, interromperá. Então você acaba tendo o arquivo em ambos os lados. Não há mudança em mv para evitar esse comportamento, portanto, neste caso, cp & & rm é preferível.

    
por 18.09.2013 / 13:50