Eu arrasto e solto uma pasta em outra por engano no FileZilla.
~/big_folder
~/some_other_folder
A pasta foi movida é muito grande. Inclui centenas de milhares de arquivos (node_modules, pequenos arquivos de imagem, muitas pastas)
O que é tão estranho é que depois que eu solto o mouse, a movimentação é feita. A pasta "big_folder" é movida para "some_other_folder".
~/some_other_folder/big_folder
(não há big_folder
no ~/
depois de se mover)
Então eu percebo o erro e tento voltar, mas falha tanto no FileZilla quanto no terminal.
Então eu tenho que cp -r
copiar os arquivos de volta porque existem códigos do lado do servidor acessando esses arquivos em~/big_folder
E demora uma eternidade para esperar...
O que devo fazer?
BTW, aqui está a saída do FileZilla (é a falha da 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'
Se um diretório for movido dentro do mesmo sistema de arquivos (a mesma partição), tudo o que é necessário é renomear o caminho do arquivo do diretório. Nenhum dado além da entrada do diretório para o próprio diretório deve ser alterado.
Ao copiar diretórios, 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 renomeasse com sucesso o diretório de
~/big_folder
para~/some_other_folder/big_folder
, eu reverteria isso usando... depois de primeiro certificar-se de que não havia nenhum diretório chamado
~/big_folder
(se houvesse, a movimentação seria colocadabig_folder
desome_other_folder
dentro do~/big_folder
diretório como uma subpasta).A resposta existente é ótima, mas gostaria de expandi-la um pouco, mostrando exatamente o que está acontecendo quando você move versus quando copia um arquivo. Quando você olha para as syscalls durante uma cópia, você vê:
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 alguma E/S de disco que pode ser bastante alta para arquivos grandes. No entanto, se você mover um arquivo, verá:
É importante lembrar que você só verá o arquivo renomeado se estiver no mesmo sistema de arquivos no mesmo disco físico. Se você criar um arquivo enorme de vários gigabytes e movê-lo entre dois locais em sua casa, notará que a ação é concluída instantaneamente. Se, por outro lado, você movê-lo para um dispositivo externo, levará tanto tempo para movê-lo quanto se você o usasse
cp
. O rastreamento de syscall seria idêntico ao primeiro, masunlink("hello1.txt")
no final. Isso ocorre porque a renomeação só pode ser usada para mover um arquivo se a origem e o destino estiverem no mesmo sistema de arquivos.