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 diff
comando:
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 -r
sinalizador compara os diretórios recursivamente, enquanto o -q
sinalizador 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-dereference
sinalizador 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 diff
comando 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
-n
não copie (não faça alterações)-i
discriminar as diferenças-a
preservar (ou seja, comparar, já que temos-n
) permissões, propriedades, links simbólicos, etc. e recorrer a diretórios-H
preservar links físicos-c
comparar 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 YXcstpoguax
onde 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 rsync
abaixo --itemize-changes
para mais detalhes. Se houver diferenças na 3ª c
ou 4ª s
colunas, 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 -n
sinalizador "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/original
pelo caminho do diretório original que você copiou. - Substitua
/path/to/destination
pelo 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/bar
para/media/test/dst/
, para quedst
, depois de feita a operação de cópia, tenha o diretóriobar
. O primeiro ancestral comum estábar
aqui; porque todos os arquivosbar
terão o mesmo caminho relativo.
Algumas notas:
- As partes
bash -c
ebash {}
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
sed
parte é remover o caminho absoluto do arquivo encontrado e usar apenas o caminho relativo (isso é diferente de usarexecdir
). 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.