O que o mv faz em caso de erros?

18

Eu apenas tentei mover uma grande árvore 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 movidos para longe da árvore de origem, enquanto outros foram copiados. Provavelmente isso não é verdade, e estou apenas ignorando algo, como fiz quando verifico o local livre no disco de destino. : D

O comando foi simplesmente mv source-dir destination-dir, onde os dois diretórios residem em discos diferentes. Estou usando mv (GNU coreutils) 7.4. Em nenhum lugar da página do 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 maneira fácil e rápida)?
maaartinus
fonte

Respostas:

8

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

Ele primeiro usa o mesmo código usado pelo `cp -a 'para copiar os diretórios e arquivos solicitados e, 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ê copiar três diretórios de uma partição para outra e a cópia do primeiro diretório for bem-sucedida, mas o segundo não, o primeiro será deixado na partição de destino e o segundo e o terceiro 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 ele tenta ser atômico ( mkdirpor exemplo, é necessário inspeção de origem) ou se isso está em seu domínio (contra o kernel), mas pode haver corrupção se a interrupção ocorrer quando ele já estiver excluindo o fonte. Nesse ponto, você já teria uma boa cópia no diretório de destino, portanto, uma simples verificação de tamanho de byte poderia fazer o truque.

EDIT: Eu 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ápida) ou depois não tive nenhuma chance devido ao armazenamento em cache do disco e talvez ao bom design do sistema de arquivos (meu ^ C sempre chegava depois que a mudança era bem-sucedida )

lynxlynxlynx
fonte
11
Em relação à página de informações, entendo corretamente que, para cada diretório de origem da linha de comando , ele é removido se a cópia correspondente for bem-sucedida? Quero dizer que mv src1 src2 dstfunciona nesse sentido de forma semelhante a mv src1 dst; mv src2 dstcada single mv src dste como cp -a src dst && rm -rf src?
Maaartinus
11
É assim que eu também entendo (apenas seus mvs seriam mv && mv). Como cp -ajá é recursivo, duvido que se aplique a arquivos e diretórios individuais encontrados ao percorrer a árvore. Fará alguns testes mais tarde.
Lynxlynxlynx
12

Quando o mv está mudando para um sistema de arquivos diferente, ele 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 por falha, o local de origem ainda deverá conter todos os dados.

Na recuperação, apenas os dados de destino devem estar corrompidos. Em vez de usar mv para novamente, basta usar rsync e depois rm manualmente

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