Zróżnicuj kilka plików, prawda, jeśli nie wszystkie są równe


18

Mam wiele plików, chcę sprawdzić, czy wszystkie te pliki mają tę samą zawartość.

Jakiego wiersza polecenia można użyć do sprawdzenia tego?

Użycie może być takie jak:

$ diffseveral file1 file2 file3 file4

Wynik:

All files equals

LUB

Files are not all equals

Odpowiedzi:


27

W GNU diff przekaż jeden z plików jako argument --from-filei dowolną liczbę innych jako argument:

$ 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

Co powiesz na:

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

Oblicza wartość MD5 dla każdego pliku, a następnie porównuje każdy wpis z następnym, jeśli są różne, a następnie zwraca zerowy (prawdziwy) status wyjścia. Byłoby to znacznie krótsze, gdyby zwrócił false, jeśli jest inny:

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

Nie ma potrzeby sortowania, ponieważ sprawdzamy, czy coś jest inne.


1
W krótszej wersji należy chyba użyć $ 1, ponieważ $ 0 zawiera unikalną nazwę pliku.
xanpeng,

2

Poniższy kod powinien być dość zrozumiały. $#jest liczbą argumentów pliku i shiftpo prostu zużywa je pojedynczo. Używa cmp -scichego bajtowego porównania.

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

Możesz tylko diff dwa na raz, ale dość łatwo jest sprawdzić, czy wszystkie są równe:

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

Jeśli masz wystarczająco dużo, aby uzasadnić pętlę, użyj czegoś takiego:

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

Niezdarny, jeśli masz pięćdziesiąt plików lub nie wiesz, ile
DarenW

1
@DarenW Jasne, jeśli masz ich tak wiele, skorzystaj z pętli.
Kevin
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.