Por que o mv é muito mais rápido que o cp? Como eu me recupero de um comando mv incorreto?

14

A história é simples:

Eu arrasto e solto uma pasta em outra por engano no FileZilla.

~/big_folder
~/some_other_folder

A pasta movida é muito grande. Inclui centenas de milhares de arquivos (node_modules, arquivos de imagem pequenos, muitas pastas)

O que é tão estranho é que depois que eu libero meu mouse, o movimento está feito. A pasta "big_folder" é movida para "some_other_folder".

~/some_other_folder/big_folder

(não há big_folder no ~/ após a mudança)

Então percebo o erro e tento voltar, mas ele falha no FileZilla e no terminal.

Então, tenho que cp -r copiar os arquivos de volta porque há códigos do lado do servidor acessando esses arquivos em ~/big_folder

E demora para sempre esperar ...

O que devo fazer?

BTW, aqui está a saída do FileZilla (é a falha do movimento de volta):

Status:       Renaming '/root/big_folder' to '/root/some_other_folder/big_folder'
Status:       /root/big_folder -> /root/some_other_folder/big_folder

Status:       Renaming '/root/some_other_folder/big_folder' to '/root/big_folder'
Command:  mv "big_folder" "/root/big_folder"
Error:          mv /root/some_other_folder/big_folder /root/big_folder: received failure with description 'Failure'
    
por AGamePlayer 09.07.2018 / 17:00

2 respostas

61

Se um diretório é movido dentro do mesmo sistema de arquivos (a mesma partição), então tudo que é necessário é renomear o caminho do arquivo do diretório. Nenhum dado além da entrada de diretório para o próprio diretório deve ser alterado.

Quando os diretórios copiar , os dados de cada arquivo precisam ser duplicados. Isso envolve ler todos os dados de origem e gravá-los no destino.

Mover um diretório entre sistemas de arquivos envolveria copiar os dados para o destino e removê-los da origem. Isso levaria tanto tempo quanto copiar (duplicar) os dados em um único sistema de arquivos.

Se o FileZilla renomeou com sucesso o diretório de ~/big_folder para ~/some_other_folder/big_folder , então eu reverteria isso usando

mv ~/some_other_folder/big_folder ~/big_folder

... depois de ter certeza de que não havia um diretório chamado ~/big_folder (se houvesse, a movimentação colocaria big_folder de some_other_folder no diretório ~/big_folder como uma subpasta).

    
por 09.07.2018 / 17:07
10

A resposta existente é ótima, mas eu gostaria de expandir um pouco, mostrando exatamente o que está acontecendo quando você se move versus quando você copia um arquivo. Quando você olha para o syscalls durante uma cópia, você vê:

open("hello1.txt", O_RDONLY)               = 3
open("hello2.txt", O_WRONLY|O_CREAT, 0644) = 4
read(3, "Hello, world!\n", 4096)           = 14
write(4, "Hello, world!\n", 14)            = 14
close(3)                                   = 0
close(4)                                   = 0

Isso abre o arquivo de origem e cria um segundo arquivo. Em seguida, ele lê o conteúdo do arquivo de origem na memória e grava essa memória no arquivo de destino. Isso requer várias opções de contexto e algumas E / S de disco, que podem ser bastante altas para arquivos grandes. Se você mover um arquivo, verá:

rename("hello1.txt", "hello2.txt")         = 0

É importante lembrar que você verá apenas o arquivo ser renomeado se estiver na mesma partição no mesmo disco físico. Se você criar um arquivo enorme de vários gigabytes e, em seguida, movê-lo entre dois locais em sua casa, perceberá que a ação é concluída instantaneamente. Se, por outro lado, você movê-lo para um dispositivo externo, levará o mesmo tempo para se mover como se você tivesse usado cp . Isso ocorre porque mover um arquivo só pode ser feito renomeando-o se estiver na mesma partição.

    
por 10.07.2018 / 05:41

Tags