Respostas:
Se você mover um diretório no mesmo sistema de arquivos, somente moverá a entrada do diretório de um local no sistema de arquivos para outro. Por exemplo, mv /source/dir /target/dir
irá apagar a entrada de diretório de dir
partir /source
e criar um novo em /target
. Isso é feito por uma chamada do sistema atômico (ou seja, ininterrupta). O inode que contém as entradas do diretório dir
e 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, todos os arquivos serão copiados primeiro para o novo sistema de arquivos e depois desvinculados do original. Portanto, se você interromper mv
a cópia, poderá acabar com duas cópias de alguns dos arquivos - no local antigo e no novo.
strace mv /fs1/dir /fs2/
- a última coisa que o mv faz é chamar unlinkat
todos os arquivos de origem de uma só vez (não um por um, pois são copiados).
A implementação GNU repete os argumentos na linha de comando, tenta renomear primeiro e, se isso falhar, copia recursivamente e exclui recursivamente a fonte. assim
mv a b c/
excluirá a antes de copiar b e não começará a excluir nada em a antes que a cópia de destino seja concluída.
Observe que isso se aplica apenas à implementação GNU.
Para esclarecer: se um é um diretório que contém d e e , e b é um arquivo, a ordem será
mv
também, portanto, não é apenas GNU.
Você move um diretório, interrompe a movimentação e o diretório original permanece intacto:
$ mv a b/
Se você mover vários diretórios, cada um ficará intacto na origem ou no destino, dependendo de quando você interrompeu:
$ mv a b c/
Como recebi 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 na pasta grande de origem permaneceu o mesmo, e o conteúdo parcial foi deixado no diretório NFS. Eu usei "find. -Type f | wc -l" para verificar.
Parece que a resposta de Simon está correta.
A resposta aceita está definitivamente errada sobre a mudança entre sistemas de arquivos - um fato que já me salvou muitos problemas algumas vezes. Ao mover um diretório que contém subdiretórios, nenhum arquivo em um subdiretório será excluído antes que todo o subdiretório tenha sido copiado. Ou seja, 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. Portanto, a resposta de Simon me parece a correta.
Não. O mv opera objeto por objeto; portanto, os objetos que já foram processados serão removidos da fonte.
Definitivamente não. A movimentação é feita objeto a objeto. Portanto, o objeto movido para o destino até o ponto de interrupção não deve mais existir na fonte.
Se o mv foi emitido para um arquivo grande (entre diferentes) e foi interrompido, a fonte estará intacta. No alvo, você verá um arquivo incompleto até o ponto de interrupção.
No entanto, você pode restaurar o mv com o mesmo comando e o processo continuará.
Se você deseja interromper o mv porque deseja desconectar-se do terminal, basta enviá-lo para segundo plano:
* press Ctrl+Z
# bg
# disown
fsck
(que provavelmente será executado automaticamente na reinicialização, pois o disco não foi desmontado corretamente).