O que mv faz em caso de erros?

O que mv faz em caso de erros?

Acabei de tentar mover uma árvore grande de um disco para outro, que era muito pequena. Agora, fico com algo que realmente não consigo entender - parece que alguns arquivos foram realmente movidos para fora da árvore de origem, enquanto outros foram apenas copiados. Provavelmente isso não é verdade, e estou apenas ignorando algo, como fiz quando verifiquei o espaço livre no disco de destino. :D

O comando era simplesmente mv source-dir destination-dir, onde ambos os diretórios residem em discos diferentes. Estou a usar mv (GNU coreutils) 7.4. Em nenhum lugar da página de manual encontrei as respostas para as seguintes perguntas:

  • arquivos truncados podem ser criados?
  • em caso de erros, alguma coisa na árvore de origem será excluída?
  • como recuperar (de forma fácil e rápida)?

Responder1

Quando mv está migrando para um sistema de arquivos diferente, ele primeiro copia todos os dados para o novo sistema de arquivos. Depois que os novos dados são copiados, os dados antigos são removidos. Isso significa que se a movimentação for interrompida ou falhar, o local de origem ainda deverá conter todos os dados.

No que diz respeito à recuperação, apenas os dados de destino devem estar corrompidos. Em vez de usar mv novamente, basta usar rsync e depois rm manualmente

rsync -av source-dir/ dest-dir/
rm -rf source-dir

Responder2

Acho que a introdução da infopágina responde a todas as suas perguntas:

Ele primeiro usa parte do mesmo código usado por `cp -a' para copiar os diretórios e arquivos solicitados e, em seguida (assumindo que a cópia foi bem-sucedida) remove os originais. Se a cópia falhar, a parte que foi copiada para a partição de destino será removida. Se você copiasse três diretórios de uma partição para outra e a cópia do primeiro diretório fosse bem-sucedida, mas o segundo não, o primeiro seria deixado na partição de destino e o segundo e o terceiro seriam deixados na partição original.

A recuperação não deve ser um problema, pois os dados são preservados. Eu não sei o quanto isso tenta seratômico( mkdirpor exemplo, é necessária inspeção da fonte) ou se estiver em seu domínio (vs. o do kernel), mas pode haver corrupção se a interrupção ocorrer quando já estiver excluindo a fonte. Nesse ponto, você já teria uma boa cópia no diretório de destino, portanto, uma simples verificação do tamanho de bytes poderia resolver o problema.

EDIT: Fiz alguns testes com arquivos enormes (alguns G) criados com dd, mas sem resultados conclusivos. Nunca consegui copiar apenas algumas das fontes - cancelei toda a operação (sendo muito rápido) ou depois não tive nenhuma chance devido ao cache de disco e talvez ao bom design do sistema de arquivos (meu ^C sempre pousou após a mudança ter sucesso ).

informação relacionada