Eu tenho (bem, eu tinha ) um diretório:
/media/admin/my_data
Tinha aproximadamente 49 GB de tamanho 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 emiti o comando do diretório inicial e acabei fazendo:
~% sudo mv /media/admin/my_data my_data_on_60GB_partition
Então o mv
programa começou a se mover /media/admin/my_data
e seu conteúdo para um novo diretório ~/my_data_on_60GB_partition
.
Eu usei Ctrl+ Cpara 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 da raiz.
Estou assumindo que o mv
programa deve ter copiado os arquivos como root inicialmente e, depois da transferência chown
, os voltou para a minha conta de usuário.
Eu tenho um backup um pouco antigo do diretório / partição.
Minha pergunta é: é possível restaurar com segurança o grupo de arquivos que foram movidos?
Ou seja, posso apenas executar:
sudo mv ~/my_data_on_60GB_partition/* /media/admin/my_data
ou devo desistir de tentar recuperar, pois os arquivos estão possivelmente corrompidos e parcialmente completos, etc.?
- OS - Ubuntu 16.04
mv --version
mv (GNU coreutils) 8.25
fonte
Control-Z
(pausar) em vez deControl-C
. Nesse caso, você seria capaz de ver qual arquivo estava sendo transferido naquele momento e, assim, saber qual arquivo foi copiado apenas parcialmente. Você pode então decidir com calma como proceder. (Usekill -stop
para processos que não estão no tty).(2GB + 47GB) < 60GB
. a capacidade da partição é de 60 GB, tamanho da pasta e seu conteúdo: 49 GB.Respostas:
Ao mover arquivos entre sistemas de arquivos,
mv
não exclui um arquivo antes de terminar de copiá-lo e processa os arquivos sequencialmente (eu disse inicialmente que ele copia e exclui cada arquivo por vez, mas isso não é garantido - pelo menos asmv
cópias GNU excluem cada comando - argumento de linha, 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 a
-i
sinalização paramv
não substituir nada:(supondo que você não tenha nenhum arquivo oculto do qual restaurar
~/my_data_on_60GB_partition/
), ou melhor ainda (como você descobriu que você pode ter muitos arquivos esperando para serem excluídos), adicione o-n
sinalizador paramv
que não substitua nada, mas que não substitua pergunte sobre isso:Você também pode adicionar a
-v
bandeira para ver o que está sendo feito.Com qualquer POSIX compatível
mv
, a estrutura de diretórios original ainda deve estar intacta; portanto, você pode verificar isso - e simplesmente excluir/media/admin/my_data
... (No caso geral, acho que amv -n
variante é a abordagem segura - ele lida com todas as formas demv
, incluindo, por exemplomv /media/admin/my_data/* my_data_on_60GB_partition/
.)Você provavelmente precisará restaurar algumas permissões; você pode fazer isso em massa usando
chown
echmod
, ou restaurá-los a partir de backups usandogetfacl
esetfacl
(obrigado a Sato Katsura pelo lembrete ).fonte
find
para encontrar e definir permissões. Existem muitos arquivos no novo diretório que possuem espaços nos nomes de arquivos, mas nenhum arquivo oculto - que eu conheço. Você acha que o globo no comandosudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/
expandiria o nome do arquivo sem problemas de divisão de palavras? Eu estava pensando alternativamente que eu poderia usar osudo rsync ~/my_data_on_60GB_partition/ /media/admin/my_data/
que acredito que iria lidar com os caminhos de arquivo com espaços?rsync
recurso para verificar a integridade de todos os arquivos. Mas é bom saber que eu não preciso disso.su command mv -i ...
(ousu /bin/mv -i ...
), em vez desudo mv -i ...
), no caso de algum administrador (estranho) tornar o "mv" uma função que faz o "mv -f" no nível do sistema (ou seja, / etc / profile ou esses arquivos gerais do sistema) .. comando command: inicie o comando alguma coisa, e não uma função ou apelido com o mesmo nome. (por exemplo: um pode ser (muito!) azarado e ter um (muito, muito ruim!)function mv { /bin/mv -f -- "$@" }
em um arquivo que é sempre originado e, em seguida, "rm -i something" não pede nada (e apenas protesta que "-i "arquivo não existe) ... [Eu tenho ver essas coisas ... tremer ]Depois de obter a resposta de Stephen Kitt e discutir este comando como uma solução potencial:
Decidi adiar a execução até entender o que estava acontecendo, esta resposta descreve o que descobri e acabei fazendo.
Estou usando o Gnu,
mv
que copia arquivos para o destino; somente se a operação de cópia for bem-sucedida, ele excluirá o original.No entanto, eu queria confirmar se
mv
essa sequência é executada um arquivo por vez. Se isso fosse verdade, o conteúdo da pasta original seria dividido em duas partes, uma parte deslocada para o destino e a outra ainda na fonte. E, possivelmente, haveria um arquivo que foi interrompido durante a cópia, que seria comum entre os dois diretórios - e provavelmente teria um formato incorreto.Para descobrir arquivos comuns entre os dois diretórios, executei:
Este resultado sugeriu que havia 14.237 instâncias dos mesmos arquivos nos diretórios de origem e de destino, confirmei verificando os arquivos manualmente - sim, havia muitos dos mesmos arquivos nos dois diretórios. Isso sugere que somente após a
mv
cópia de grandes faixas de arquivos ele executa a exclusão dos arquivos de origem. Uma pesquisa rápida noinfo
nomv
comando mostrouNão executei o comando, mas suspeito que se tentasse executar
O
-i
prompt antes da substituição provavelmente teria disparado mais de 14.000 vezes.Então, para descobrir quantos arquivos totais no diretório recém-criado:
Portanto, se houvesse um total de 14238 arquivos regulares no novo diretório e 14237 tivessem originais idênticos na origem, isso significa que havia apenas um arquivo no novo diretório que não tinha um arquivo idêntico correspondente na origem. Para descobrir o que era esse arquivo, executei o rsync de volta na direção da fonte:
Uma verificação rápida confirmou que este era o arquivo malformado, onde o arquivo existia na origem e no destino, arquivo de destino = 64MB, original = 100MB. Este arquivo e sua hierarquia de diretórios ainda pertenciam à raiz e ainda não tinham as permissões originais restauradas.
Então, em resumo:
mv
nunca foram alcançados ainda estão de volta em seus locais originais (obviamente)mv
copiaram completamente ainda tinham suas cópias originais no diretório de origemEm outras palavras, todos os arquivos originais ainda estavam intactos e a solução nesse caso foi simplesmente excluir o novo diretório!
fonte
-n
seria melhor no caso geral. Eu verifiquei omv
código fonte, ele exclui a fonte, um argumento de cada vez.mv
é que a exclusão na fonte. Assim, o comandomv foo bar baz
se moveriafoo
parabaz/foo
, em seguida, elimine o originalfoo
, em seguida, moverbar
parabaz/bar
..?cmp
vez dediff
comparar arquivos binários. Além disso, sua discussão acima faz sentido apenas ao mover arquivos por diferentes sistemas de arquivos. Não há cópia envolvida ao mover arquivos dentro do mesmo sistema de arquivos.Eu apenas pensei em comentar que algumas pessoas podem ficar tentadas a jogar 'xargs' na mistura para executar as coisas em paralelo. Isso me dá vontade e eu realmente gosto da solução rsync acima.
Quanto às coisas do sistema de arquivos sobre movimentação e cópia e quando exatamente o original é excluído, o VFS e o (s) sistema (s) de arquivos subjacente se coordenam para garantir a atomicidade por arquivo antes de chegar à etapa de exclusão. Portanto, mesmo que seja interrompido antes que o arquivo de destino seja totalmente gravado, todo o bloqueio no VFS é realmente rigoroso e protege contra coisas como intercalação aleatória de dados, mesmo em casos paralelos. (Eu trabalhei no Linux VFS e NFS4)
Adicionar 'xargs' à mistura provavelmente tornaria a etapa de verificação de sanidade dupla uma dor de cabeça, com vários arquivos no meio do trânsito. Eu gostaria de ter tido mais scripts de nível de sistema. Bons lembretes para mim!
Adorei a pergunta, bom para teias de aranha, e me faz amar rsync novamente. Felicidades!
fonte