Diff vários arquivos, true se todos não iguais

17

Eu tenho vários arquivos, quero verificar se todos esses arquivos têm o mesmo conteúdo.

Qual linha de comando eu poderia usar para verificar isso?

O uso pode ser algo como:

$ diffseveral file1 file2 file3 file4

Resultado:

All files equals

OR

Files are not all equals
    
por Nicolas Raoul 07.03.2012 / 03:43

4 respostas

24

Com o GNU diff, passe um dos arquivos como um argumento para --from-file e qualquer número de outros como operando:

$ diff -q --from-file file1 file2 file3 file4; echo $?
0
$ echo >>file3
$ diff -q --from-file file1 file2 file3 file4; echo $?
Files file1 and file3 differ
1
    
por 07.03.2012 / 19:07
4

Que tal:

md5sum * | awk 'BEGIN{rc=1}NR>1&&$1!=last{rc=0}{last=$1}END{exit rc}'

Calcula o valor MD5 para cada arquivo, compara cada entrada com a próxima, se houver alguma, e retorna um status de saída zero (true). Isso seria muito mais curto se retornasse falso se diferente:

md5sum * | awk 'NR>1&&$1!=last{exit 1}{last=$1}'

Não há necessidade de classificar, pois estamos apenas verificando se há algum diferente.

    
por 07.03.2012 / 03:59
2

O código a seguir deve ser bastante evidente. $# é o número de argumentos do arquivo e shift apenas os consome um de cada vez. Usa cmp -s para comparação silenciosa em bytes.

#!/bin/sh
# diffseveral

if [ $# -lt 2 ]; then
    printf '%s\n' "Usage: $0 file1 file2 [files ...]" >&2
    exit 2
fi

oldfile="$1"
shift

while [ $# -gt 0 ]; do
    newfile="$1"
    if ! cmp -s "$oldfile" "$newfile"; then
         echo 'Files differ.'
         exit 1;
    fi

    shift
done

echo 'All files identical.'
exit 0
    
por 07.03.2012 / 05:18
0

Você pode usar apenas diff dois de cada vez, mas é fácil verificar se todos são iguais:

if diff file1 file2 && diff file2 file3 && diff file3 file4; then
    echo All equal
else
    echo Not
fi

Se você tiver o suficiente para justificar um loop, use algo assim:

alleq () {  
    for file; do 
        diff -q "$1" "$file" >/dev/null || return 1
    done
}

if alleq file1 file2 ...; then
    echo All equal
else 
    echo Not
fi
    
por 07.03.2012 / 03:53

Tags