Verificando um diretório grande após copiar de um disco rígido para outro

Verificando um diretório grande após copiar de um disco rígido para outro

Eu tenho um servidor de arquivos doméstico no qual uso o Ubuntu.

Recentemente, uma das minhas unidades ficou cheia, então peguei outra e joguei lá.

Eu tenho uma pasta muito grande, o diretório tem cerca de 1,7 T e contém uma quantidade razoável de arquivos.

eu useiGCPCOPIAR os arquivos da unidade antiga para a nova e parece ter funcionado bem.

Quero agora validar o novo diretório na nova unidade em relação ao diretório original na unidade antiga antes de excluir os dados da unidade antiga para liberar espaço. Entendo que posso fazer uma verificação CRC para fazer isso.

Como, especificamente, posso fazer isso?

Responder1

Eu simplesmente usaria o diffcomando:

diff -rq --no-dereference /path/to/old/drive/ /path/to/new/drive/

Isso lê e compara todos os arquivos nas árvores de diretórios e relata quaisquer diferenças. O -rsinalizador compara os diretórios recursivamente, enquanto o -qsinalizador apenas imprime uma mensagem na tela quando os arquivos diferem - em vez de imprimir as diferenças reais (como faz para arquivos de texto). O --no-dereferencesinalizador pode ser útil se houver links simbólicos diferentes, por exemplo, em um diretório, um link simbólico e, no diretório correspondente, uma cópia do arquivo ao qual foi vinculado.

Se o diffcomando imprimirsem saída, isso significa que as árvores de diretórios são realmente idênticas; você pode executar echo $?para verificar se seu status de saída é 0, indicando que ambos os conjuntos de arquivos são iguais.

Não creio que calcular CRCs ou somas de verificação seja particularmente benéfico neste caso. Faria mais sentido se os dois conjuntos de arquivos estivessem em sistemas diferentes e cada sistema pudesse calcular as somas de verificação para seu próprio conjunto de arquivos, de modo que apenas as somas de verificação precisassem ser enviadas pela rede. Outro motivo comum para calcular somas de verificação é manter uma cópia das somas de verificação para uso futuro.

Responder2

sincronizar novamenteé frequentemente usado para copiar arquivos em vez de gcp, mas também pode ser usado para verificar uma cópia, independentemente de como ela foi feita. Simplesmente faça

rsync -niaHc /origfolder/ /copyfolder

Tenha cuidado para terminar o nome da primeira pasta (a fonte) com uma extensão /. As opções são

  • -nnão copie (não faça alterações)
  • -idiscriminar as diferenças
  • -apreservar (ou seja, comparar, já que temos -n) permissões, propriedades, links simbólicos, etc. e recorrer a diretórios
  • -Hpreservar links físicos
  • -ccomparar somas de verificação

A saída mostra um código detalhando as diferenças para cada arquivo ou diretório diferente. Não há saída se eles forem iguais. O código possui colunas YXcstpoguaxonde cada caractere é um ponto .se esse aspecto da comparação estiver ok, ou uma letra:

Y is type of update: 
   < sent (not appropriate in this case)
   > need to copy 
   c missing file or directory
   h is hard link
   . no update
   * and rest of line is a message, eg *deleting
X file type: f file  d dir  L symlink  D device S special file
c checksum differs. + new item  " " same
s size differs
t timestamp differs
p permissions differ
o owner differ
g group differ
u (not used)
a acl differ
x extended attributes differ

Por exemplo,

.d..t...... a/b/                    directory timestamp differs
cL+++++++++ a/b/d -> /nosuch2       symbolic link missing
cS+++++++++ a/b/f                   special file missing (a/b/f is a fifo)
>f..t...... a/b/ff                  file timestamp differs
hf          a/b/xx1 => a/b/xx       files should be a hard linked
cLc.t...... a/b/z -> /tmp/hi2       symbolic link to different name
cd+++++++++ a/c/                    directory missing
>f+++++++++ a/c/i.10                missing file needs to be copied

Veja man rsyncabaixo --itemize-changespara mais detalhes. Se houver diferenças na 3ª cou 4ª scolunas, você terá uma grave corrupção de dados. Outros sinalizadores, como permissões, proprietários ou carimbos de data/hora diferentes, podem ser menos importantes para você. Se todos os arquivos estiverem marcados como "ausentes", provavelmente você não forneceu os diretórios corretos para comparação. Se você tiver certeza, executar o rsync sem o -nsinalizador "consertará" as diferenças.

Responder3

Eu tive a mesma pergunta e useiA resposta de Antônio, com um pouco de torção.

Aplicar diretamente sua resposta falhará no caso de alguma falha de hardware (como erro de entrada/saída) que força a saída do diff.

Eu compilei sua resposta, junto comesta resposta, e coloque tudo nisso:

find /path/to/original -type f -exec bash -c 'diff -rq --no-dereference "$@" "/path/to/destination/$(sed -r "s/^.*(<first-common-ancestor>.*)$/\1/g" <<<"$@")"' bash {} \;
  • Substitua /path/to/originalpelo caminho do diretório original que você copiou.
  • Substitua /path/to/destinationpelo caminho do diretório de destino para o qual você copiou.
  • Substitua <first-common-ancestor>pelo diretório ancestral comum entre ambos. Exemplo: você está copiando de /media/foo/barpara /media/test/dst/, para que dst, depois de feita a operação de cópia, tenha o diretório bar. O primeiro ancestral comum está baraqui; porque todos os arquivos barterão o mesmo caminho relativo.

Algumas notas:

  • As partes bash -ce bash {}devem realizar a substituição segura do nome dos arquivos; estar do lado seguro e não ser prejudicado por possíveis ataques (como elevação de privilégios).
  • A sedparte é remover o caminho absoluto do arquivo encontrado e usar apenas o caminho relativo (isso é diferente de usar execdir). Se você não tem certeza de como isso é útil, tente removê-lo e verifique as mensagens de erro :)
  • O <<<para ler a variável como uma string em vez de lê-la como um caminho para um arquivo a ser lido.

informação relacionada