Diff molti file, vero se non tutti uguali


18

Ho un numero di file, voglio verificare che tutti questi file abbiano lo stesso contenuto.

Quale riga di comando posso usare per verificarlo?

L'utilizzo potrebbe essere qualcosa del tipo:

$ diffseveral file1 file2 file3 file4

Risultato:

All files equals

O

Files are not all equals

Risposte:


27

Con GNU diff, passa uno dei file come argomento --from-filee un numero qualsiasi di altri come 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

4

Che ne dite di:

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

Calcola il valore MD5 per ciascun file, quindi confronta ogni voce con la successiva, se ce ne sono diverse, quindi restituisce uno stato di uscita zero (vero). Questo sarebbe molto più breve se restituisse false se diverso:

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

Non è necessario ordinare poiché stiamo solo verificando se ci sono differenze.


1
Nella versione più breve, suppongo che dovrebbe essere usato $ 1, poiché $ 0 contiene un nome file univoco.
Xanpeng

2

Il seguente codice dovrebbe essere abbastanza autoesplicativo. $#è il numero di argomenti del file e shiftli consuma uno alla volta. Utilizza cmp -sper un confronto silenzioso per byte.

#!/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

0

Puoi solo diffdue alla volta, ma è abbastanza facile controllare se sono tutti uguali:

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

Se hai abbastanza per giustificare un loop, usa qualcosa del genere:

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

Goffo se hai cinquanta file o non sai quanti
DarenW

1
@DarenW Certo, se ne hai molti, usa semplicemente un loop.
Kevin,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.