Eu acabei de “mv” editar um diretório de 49GB para um caminho de arquivo incorreto, é possível restaurar o estado original dos arquivos?

57

Eu tenho (bem, eu tive ) um diretório:

/media/admin/my_data

Ele tinha aproximadamente 49 GB e continha dezenas de milhares de arquivos. O diretório é o ponto de montagem de uma partição LUKS ativa.

Eu queria renomear o diretório para:

/media/admin/my_data_on_60GB_partition

Eu não percebi na época, mas eu emiti o comando do diretório home, então acabei fazendo:

~% sudo mv /media/admin/my_data my_data_on_60GB_partition

Então, o programa mv começou a mover /media/admin/my_data e seu conteúdo para um novo diretório ~/my_data_on_60GB_partition .

Eu usei Ctrl + C para cancelar o comando no meio, então agora eu tenho um monte de arquivos divididos em diretórios:

~/my_data_on_60GB_partition    <---  about 2GB worth files in here

e

/media/admin/my_data           <---- about 47GB of orig files in here    

O novo diretório ~/my_data_on_60GB_partition e alguns de seus subdiretórios são de propriedade de root.
Estou assumindo que o programa mv deve ter copiado os arquivos como root inicialmente e depois da transferência chown os retornou para minha conta de usuário.

Eu tenho um backup antigo do diretório / partição.
A minha pergunta é, é possível restaurar de forma confiável o conjunto de arquivos que foram movidos?

Ou seja, posso simplesmente executar:

sudo mv ~/my_data_on_60GB_partition/*  /media/admin/my_data

ou devo desistir de tentar me recuperar, pois os arquivos estão possivelmente corrompidos e parcialmente completos, etc?

  • OS - Ubuntu 16.04
mv --version  
mv (GNU coreutils) 8.25
    
por the_velour_fog 27.10.2016 / 11:29

3 respostas

86

Ao mover arquivos entre sistemas de arquivos, mv não exclui um arquivo antes de finalizá-lo e processa arquivos sequencialmente (inicialmente, copiei e exclui cada arquivo, mas isso não é garantido - pelo menos o GNU mv copia, em seguida, apaga cada argumento da linha de comando , por sua vez, e POSIX especifica esse comportamento ). Portanto, você deve ter no máximo um arquivo incompleto no diretório de destino e o original ainda estará no diretório de origem.

Para mover as coisas de volta, adicione o -i flag, então mv não sobrescreve nada:

sudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/

(assumindo que você não tem arquivos ocultos para restaurar a partir de ~/my_data_on_60GB_partition/ ), ou melhor ainda (dado que, como você descobriu, você pode ter muitos arquivos aguardando para serem excluídos), adicione o -n flag mv não sobrescreve nada, mas não pergunta sobre isso:

sudo mv -n ~/my_data_on_60GB_partition/* /media/admin/my_data/

Você também pode adicionar a -v flag para ver o que está sendo feito.

Com qualquer mv compatível com POSIX, a estrutura de diretório original ainda deve estar intacta, então, alternativamente, você pode verificar isso - e simplesmente excluir /media/admin/my_data ... (No caso geral, acho que mv -n variant é a abordagem segura - lida com todas as formas de mv , incluindo por exemplo mv /media/admin/my_data/* my_data_on_60GB_partition/ .)

Você provavelmente precisará restaurar algumas permissões; você pode fazer isso em massa usando chown e chmod ou restaurá-los dos backups usando getfacl e setfacl (graças a Sato Katsura para o lembrete ).

    
por 27.10.2016 / 11:49
18

Depois de obter a resposta de Stephen Kitt e discutir este comando como uma solução potencial:

sudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/

Eu decidi adiar a execução até que fiquei sabendo o que estava acontecendo, essa resposta descreve o que eu descobri e acabei fazendo.

Estou usando o Gnu mv , que copia arquivos para o destino e, somente se a operação de cópia for bem-sucedida, excluirá o original.
No entanto, eu queria confirmar se mv executa essa sequência um arquivo de cada vez, se isso fosse verdade, o conteúdo da pasta original teria sido dividido em duas partes, uma parte deslocada para o destino, a outra ainda deixada para trás na fonte. E possivelmente haveria um arquivo que foi interrompido durante a cópia, o que seria comum entre os dois diretórios - e provavelmente seria mal formado.

Para descobrir arquivos comuns entre os dois diretórios, eu corri:

~% sudo diff -r --report-identical-files my_data_on_60GB_partition/. /media/admin/mydata/. | grep identical | wc -l
14237

Esse resultado sugeriu que havia 14.237 instâncias dos mesmos arquivos nos diretórios de origem e destino, confirmei verificando os arquivos manualmente - sim, havia muitos dos mesmos arquivos em ambos os diretórios. Isso sugere que somente após mv copiar grandes faixas de arquivos, ele executa a exclusão dos arquivos de origem. Uma pesquisa rápida no comando info on mv mostrou

It [mv] 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.

Eu não executei o comando, mas suspeito se tentei executar

sudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/

O aviso -i antes de sobrescrever provavelmente teria sido acionado mais de 14.000 vezes.

Então, para descobrir quantos arquivos totais no diretório recém-criado:

~% sudo find my_data_on_60GB_partition/ -type f -a -print | wc -l                                                                    
14238

Então, se havia um total de 14238 arquivos regulares no novo diretório e 14237 tinha originais idênticos de volta na origem, isso significa que havia apenas um arquivo no novo diretório que não tinha um arquivo idêntico correspondente de volta a fonte. Para descobrir qual era esse arquivo, executei o rsync de volta na direção da origem:

~% sudo rsync -av --dry-run my_data_on_60GB_partition/ /media/admin/my_data
sending incremental file list
./
Education_learning_reference/
Education_learning_reference/Business_Education/
Education_learning_reference/Business_Education/Business_education_media_files/
Education_learning_reference/Business_Education/Business_education_media_files/Jeff Hoffman - videos/
Education_learning_reference/Business_Education/Business_education_media_files/Jeff Hoffman - videos/Jeff and David F interview/
Education_learning_reference/Business_Education/Business_education_media_files/Jeff Hoffman - videos/Jeff and David F interview/018 business plans-identifying main KPIs.flv

sent 494,548 bytes  received 1,881 bytes  330,952.67 bytes/sec
total size is 1,900,548,824  speedup is 3,828.44 (DRY RUN)

Uma verificação rápida confirmou que esse era o arquivo malformado, em que o arquivo existia na origem e no destino, arquivo de destino = 64 MB, original = 100 MB. Esse arquivo e sua hierarquia de diretórios ainda eram de propriedade do root e ainda não tinham as permissões originais restauradas.

Então, em resumo:

  • todos os arquivos que mv nunca alcançaram ainda estão de volta em seus locais originais (obviamente)
  • todos os arquivos que mv copiaram completamente ainda tiveram suas cópias originais no diretório de origem
  • o arquivo que foi parcialmente copiado ainda tinha o original de volta no diretório de origem

Em outras palavras, todos os arquivos originais ainda estavam intactos e a solução neste caso era simplesmente excluir o novo diretório!

    
por 28.10.2016 / 04:07
3

Eu apenas pensei em comentar que algumas pessoas podem ser tentadas a lançar 'xargs' na mistura para executar as coisas em paralelo. Isso me dá a vontade e eu realmente gosto da solução de rsync acima.

Quanto ao material do sistema de arquivos sobre mover e copiar e quando exatamente o original é excluído, o VFS e o (s) sistema (s) de arquivos subjacente coordenam para garantir a atomicidade por arquivo antes de chegar à etapa de exclusão. Assim, mesmo que seja interrompido antes que o arquivo de destino seja totalmente escrito, todo o bloqueio no VFS é estrito e protege contra coisas como a intercalação aleatória de dados, mesmo em casos paralelos. (Eu trabalhei em coisas Linux VFS e NFS4)

Adicionar 'xargs' ao mix provavelmente teria tornado a etapa de verificação de sanidade dupla uma dor de cabeça, com vários arquivos em trânsito intermediário. Eu gostaria de ter mais scripts de nível de sistema. Bons lembretes para mim!

Adorei a pergunta, boa para teias de aranha, e me faz amar o rsync novamente. Felicidades!

    
por 28.10.2016 / 22:52