O que o mv faz em caso de erros?

18

Acabei de tentar mover uma árvore grande de um disco para outro, que era muito pequeno. Agora, fiquei com algo que realmente não consigo entender - parece que alguns arquivos foram realmente removidos da árvore de origem, enquanto outros foram copiados. Isso provavelmente não é verdade, e estou apenas ignorando alguma coisa, como fiz ao verificar o local livre no disco de destino. : D

O comando era simplesmente mv source-dir destination-dir , em que os dois diretórios residem em discos diferentes. Estou usando mv (GNU coreutils) 7.4 . Em nenhum lugar da página man, 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 maneira fácil e rápida)?
por maaartinus 13.07.2012 / 22:53

2 respostas

8

Acho que a introdução à página info responde a todas as suas perguntas:

It first uses some of the same code that's used by 'cp -a' to copy the requested directories and files, then (assuming the copy succeeded) it removes the originals. If the copy fails, then the part that was copied to the destination partition is removed. If you were to copy three directories from one partition to another and the copy of the first directory succeeded, but the second didn't, the first would be left on the destination partition and the second and third would be left on the original partition.

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

EDIT: Eu fiz alguns testes com arquivos enormes (alguns G) criados com dd , mas sem resultados conclusivos. Nunca consegui obter apenas algumas das fontes copiadas - eu cancelei toda a operação (sendo muito rápido) ou depois não obtive qualquer chance devido ao cache de disco e talvez um bom design do sistema de arquivos (o meu ^ C sempre aterrava após o movimento ter sido bem-sucedido ).

    
por 13.07.2012 / 23:56
12

Quando o mv está se movendo 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, 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, apenas use rsync e, em seguida, rm manualmente

rsync -av source-dir/ dest-dir/
rm -rf source-dir
    
por 13.07.2012 / 23:50