O que acontece se mv for interrompido?

69

O que acontece se o comando Linux mv for interrompido? Diga, estou movendo um diretório inteiro para algum outro lugar e o interrompo enquanto ele está em movimento. O diretório de origem ainda estará intacto?

    
por dehmann 18.03.2011 / 10:25

7 respostas

49

Se você mover um diretório no mesmo sistema de arquivos , apenas moverá a entrada de diretório de um local no sistema de arquivos para outro. Por exemplo. mv /source/dir /target/dir excluirá a entrada de diretório de dir de /source e criará uma nova em /target . Isso é feito por uma chamada do sistema atômico (ou seja, ininterrupta). O inode contendo as entradas de diretório de dir , bem como o conteúdo real do próprio diretório, não é afetado.

Se você mover o diretório de um sistema de arquivos para outro , os arquivos serão transferidos um por um (como Ignacio menciona em sua resposta), ou seja, se você interromper o mv do já transferido os arquivos são removidos do diretório de origem.

    
por 18.03.2011 / 10:54
28

A implementação GNU itera sobre os argumentos na linha de comando, tenta renomear primeiro e, se falhar, recursivamente copia e depois recursivamente exclui a fonte. Então

mv a b c/

irá apagar a antes de copiar b , e não começará a apagar nada em a antes da cópia de destino estar completa.

Observe que isso se aplica somente à implementação do GNU.

Para esclarecer: se um é um diretório contendo d e e , e b é um arquivo, o pedido será

  • crie c / a
  • copie a / d - > c / a / d
  • copie a / e - > c / a / e
  • excluir a / d
  • excluir um / e
  • excluir um
  • cópia b - > c / b
  • excluir b
por 18.03.2011 / 14:18
10

Você move um diretório, interrompe o movimento e o diretório original permanece intacto:

$ mv a b/

Se você mover vários diretórios, cada um deles estará intacto na origem ou no destino, dependendo de quando você o interrompeu:

$ mv a b c/

Como obtive minha resposta:

$ mv --version
mv (GNU coreutils) 8.21

$ info mv
... 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.

Como teste, copiei uma pasta grande para um diretório NFS, interrompi e o número de arquivos em minha pasta grande de origem permaneceu o mesmo, e o conteúdo parcial foi deixado no diretório NFS. Eu usei "find. -Tipo f | wc -l" para verificar.

Parece que a resposta de Simon está correta.

    
por 15.05.2014 / 18:49
7

A resposta aceita está definitivamente errada sobre a movimentação entre os sistemas de arquivos - um fato que já me poupou muitos problemas algumas vezes. Ao mover um diretório que contenha subdiretórios, nenhum arquivo em um subdiretório será excluído antes que todo o subdiretório seja copiado. Isto é, entre o significado real de "objeto por objeto" - um subdiretório é um objeto (arquivo) e, portanto, sua integridade deve ser preservada por uma cópia completa no destino antes que qualquer coisa possa ser excluída. Então a resposta de Simon parece-me a correta.

    
por 29.06.2014 / 15:58
4

Não. mv opera objeto por objeto, então objetos que já foram processados serão removidos da fonte.

    
por 18.03.2011 / 10:34
2

Definitivamente não. O movimento é feito objeto por objeto. Assim, o objeto movido para o destino até o ponto de interrupção não deve mais existir na fonte.

Se mv foi emitido para um arquivo grande (entre diferentes) e foi interrompido, a fonte ficará intacta. No alvo, você verá um arquivo incompleto até o ponto de interrupção.

Você pode, no entanto, restaurar o mv com o mesmo comando e o processo continuará.

    
por 18.03.2011 / 16:25
2

Se você quiser interromper o mv porque deseja se desconectar do terminal, basta enviá-lo para o plano de fundo:

* press Ctrl+Z

# bg
# disown
    
por 28.05.2016 / 18:59

Tags