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

18

De um modo geral, fico em pânico quando percebo que, se eu cancelar a movimentação de um arquivo, isso pode causar o destino ou a fonte incompletos. Esta pergunta se aplica a plataformas baseadas em Windows e Unix. Nunca me lembro exatamente como o comando move funciona nos dois casos. Por exemplo, se você estiver movendo um diretório; copia o diretório inteiro e o apaga depois ou copia e apaga cada arquivo individualmente?

Sempre percebo, depois de digitar algo assim 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 tiver sido bem-sucedido) - ou isso não faz sentido? O que acontece exatamente quando pressiono Ctrl+ na Cmetade de uma jogada? 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 mudei alguma coisa (a última vez que usei svn) e tive dois diretórios, com conteúdo dividido. Acho que a resposta é difícil, porque nem todos os aplicativos movem grupos de arquivos da mesma maneira.

Nick Bolton
fonte
16
Faça o que fizer, apenas não exclua primeiro.
Mck
@monotone Hilarious +1
Nick Bolton

Respostas:

10

No Windows, mover para a mesma unidade e partição funcionará exatamente como o comando mv do Unix e renomeará a pasta ou mudará seu pai. No entanto, se você o movesse para outro driver ou partição, ele copiaria e excluiria arquivo por arquivo, por isso é mais eficiente usar um arquivo tar ou um arquivo zip sem compactação para mover arquivos mais rapidamente entre partições e discos rígidos . Se você cancelá-lo, ele simplesmente para onde está. Eu acreditaria que o mesmo é verdade para o Unix, mas não experimentei o suficiente para ter 100% de certeza. É apenas uma questão de alterar o inode, mas se ele estiver em outra partição ou unidade, ele precisará ser copiado para setores dessa partição ou unidade. Se você o cancelasse durante a transferência, ele já teria movido alguns arquivos, e o arquivo que está sendo transferido o verá '

Atualização: se você deseja cancelar uma mudança e quiser retomar, basta emitir novamente o pedido de mudança. Pode avisar que a pasta de destino já existe, mas os arquivos não serão substituídos (a menos que existam antes da movimentação original ou tenham sido adicionados entre as duas ordens de movimentação), pois assim que são transferidos, eles são excluídos do diretório origem (se estiver em uma partição ou unidade diferente).

Lobo
fonte
Ah, eu não tinha pensado em compressão.
Nick Bolton
Você realmente não precisa compactar, o que pode exigir muito tempo. Às vezes, um nível de compactação 0 (armazenamento) pode fazer o trabalho de mover grandes pastas pelas unidades muito mais rapidamente.
Wolf
"No Windows, mudar para a mesma unidade e partição funcionará exatamente como o comando mv do Unix e renomeará a pasta ou mudará seu pai." - Ao usar o Windows Explorer, isso não é verdade. Faz muita besteira, leva séculos e você pode acabar com o conteúdo dividido em dois diretórios; veja esta resposta a uma pergunta minha .
Maaartinus 11/03
@maaartinus Na verdade, a maneira como o Windows Explorer funciona é cavar recursivamente nas pastas, em vez de alterar o nó pai. Você está certo, no entanto, para o Windows Explorer, não é apenas uma jogada atômica. Eu assumi que a linha de comando estava sendo usada, eu deveria ter perguntado.
Wolf
11

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

( cp -apreservará os registros de data e hora para você e presumo que exista algo semelhante no Windows).

Arjan
fonte
11
Aha, timestamps. Eu não tinha pensado nisso! 1
Nick Bolton
São timestamps mesmo importante honestamente ...
Marcin
11
@Marcin, eles estão lá por um motivo, se é isso que você está perguntando ...
Macek
10

Não.

Explicação:

mv verybigdir dest

renomeia verybigdir 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 verybigdir no dest, mas o verybigdir ainda estará completo.

Sim, outros aplicativos podem mover arquivos de maneira diferente.

Timo Stamm
fonte
2
Na verdade, acho que o mv no Linux copia / exclui cada arquivo ou diretório individualmente, em vez de copiar a árvore inteira para o destino e excluir a árvore inteira da fonte ... então, se você cancelar no meio do caminho, você terá alguns arquivos nos dois lugares e nenhum diretório estará completo.
rob
3
@rob: Não. Diretórios são arquivos como qualquer outro e são tratados da mesma maneira. O comportamento que você está falando é alcançado mv verybigdir/* dest.
dmckee
2
Basicamente, o mv lida com cada argumento de uma maneira "cp && rm" ... mv verybigdir/* destdivide o mv do verybigdir em várias operações de movimentação separadas. Lembre-se sempre de que, diferentemente do Windows, um programa / ferramenta Linux não consegue ver que "*" lá, é expandido pelo shell.
Jürgen A. Erhard
4

Nas janelas, eu sempre copio e excluo em vez de mover. Uma vez eu estava movendo arquivos e foi aqui que notei pela primeira vez uma memória ruim. Ao mover o arquivo, ele parou no meio e eu recebi um erro, verifiquei a pasta de origem e o arquivo desapareceu. Verifiquei o destino e houve um arquivo corrompido. Isso aconteceu com mais frequência com arquivos de tamanho maior e a maioria deles foram downloads que levaram horas, então eu recomendo copiar e excluir. Economize seu tempo no começo, mas no final ele será recompensado.

às.
fonte
3

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

Além disso, o uso mvatravés dos limites do sistema de arquivos invoca silenciosamente um mecanismo de copiar e excluir.

Então eu acho que você deveria preferir mv.

dmckee
fonte
Bem resumido.
Nick Bolton
"um mecanismo de copiar e excluir" pode ser interpretado como "copie cada arquivo e exclua-o" ou "copie todos os arquivos e exclua todos".
Jrandom_hacker 18/04/19
2

No Windows, pelo menos, o movimento é simplesmente uma cópia e exclusão mais automatizada. Acredito que o mv mova cada arquivo individualmente, o que significa que ^ c-ing não perderá nenhum arquivo; você acabará com seus arquivos divididos em dois lugares - ao contrário do Windows Explorer, que descompactará tudo quando for cancelado.

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

Phoshi
fonte
1

Se você estiver usando ACLs no sistema de arquivos de origem, mas não no destino, o mv no Linux copiará a fonte e depois - devido à incapacidade de definir as ACLs no destino - pare. Então você acaba tendo o arquivo nos dois lados. Não existe uma opção no mv para impedir esse comportamento, portanto, neste caso, cp && rm é preferível.

uli42
fonte