verifica duas partições selecionando arquivos aleatórios e executando hashes sha1 em dois arquivos de cada partição

0

Uma resposta anterior a uma postagem mencionada para executar hashes sha1 nas imagens de uma imagem clone da unidade dd.

Outra resposta a essa postagem sugere que a imagem dd seja montada então compare se os hashes sha1 dos "arquivos importantes" coincidem.

Eu quero usar a segunda abordagem, mas em vez de selecionar manualmente os arquivos, eu gostaria de usar um monte de arquivos selecionados aleatoriamente.

Supondo que eu tenha duas partições montadas, posso selecionar um monte de arquivos aleatórios e comparar os hashes sha1 e parar com um erro se um hash não for igual?

O put de saída deve ser mais ou menos semelhante a este, se tudo correr bem:

OK: all 10000 randomly selected files have matching sha1 sums for partitions sda and sdb

Ou a saída deve ser apenas no caso de um erro e mostrar o nome do arquivo que tem uma soma sha1 diferente em ambas as partições.

Código atual em andamento:

#!/bin/bash

N=5
mydir="/home"

dirlisting='find $mydir |sort -R |tail -$N'
for fname in $dirlisting
do
    echo $fname
done
    
por mrsteve 27.09.2014 / 13:06

2 respostas

3

Como entendi sua pergunta, você quer descobrir se N arquivos aleatórios diferem entre os dois caminhos do sistema de arquivos. Comparar os arquivos deve ser mais rápido do que calcular somas de verificação de ambos os arquivos. Aqui está como você pode fazer isso:

#!/bin/sh
list1=/tmp/list1
list2=/tmp/list2
shuflist=/tmp/shuflist
n=100000 # How many files to compare.
if test ! -d "$1" -o ! -d "$2"; then
    echo "Usage: $0 path1 path2"
    exit 1
fi
exitcode=0
(cd "$1" && find . -type f >"$list1") || exit 1
(cd "$2" && find . -type f >"$list2") || exit 1
if cmp -s "$list1" "$list2"; then
    shuf -n "$n" "$list1" > "$shuflist"
    while IFS= read -r filename; do
        if ! cmp -s "$1/$filename" "$2/$filename"; then
            echo "Files '$1/$filename' and '$2/$filename' differ."
            exitcode=1
            break
        fi
    done < "$shuflist"
else
    echo File lists differ.
    exitcode=1
fi
rm "$list1" "$list2" "$shuflist"
exit $exitcode

Tenha em atenção que este script assume que nenhum dos seus nomes de ficheiro contém um carácter de nova linha.

    
por 27.09.2014 / 23:51
1

Se você quiser comparar dois diretórios com arquivos e subdiretórios, o comando diff poderá fazer isso para você. Ao executar diff -rq / caminho / para / fileset1 / caminho / para / fileset2 , ele informará quais arquivos são diferentes e quais estão faltando em qual árvore. Você poderia até mesmo estender o comando dar uma lista detalhada de todas as alterações para fins de auditoria com diff -rNau / caminho / para / fileset1 / caminho / para / fileset2 por exemplo e redirecionar a saída para um lugar que você deseja armazenar as alterações.

    
por 28.09.2014 / 15:17