Birden fazla dosya yayınlayın, hepsi eşit değilse doğru


18

Birkaç dosyam var, tüm bu dosyaların aynı içeriğe sahip olup olmadığını kontrol etmek istiyorum.

Bunu kontrol etmek için hangi komut satırını kullanabilirim?

Kullanımı şöyle olabilir:

$ diffseveral file1 file2 file3 file4

Sonuç:

All files equals

VEYA

Files are not all equals

Yanıtlar:


28

GNU diff ile, dosyalardan birini argüman olarak --from-fileve diğer herhangi bir sayıda işlenen olarak iletin:

$ 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

Nasıl olur:

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

Her dosya için MD5 değerini hesaplar, sonra her girdiyi bir sonraki ile karşılaştırır, eğer varsa farklıysa, sıfır (doğru) çıkış durumu döndürür. Farklıysa yanlış döndürürse çok daha kısa olur:

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

Sıralamaya gerek yok çünkü sadece farklı olup olmadığını kontrol ediyoruz.


1
Kısa sürümde, sanırım $ 0, benzersiz bir dosya adı içerdiğinden $ 1 kullanılmalıdır.
xanpeng

2

Aşağıdaki kod oldukça açıklayıcı olmalıdır. $#dosya bağımsız değişkenlerinin sayısıdır ve shiftbunları teker teker tüketir. cmp -sSessiz byte-wise karşılaştırması için kullanır .

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

Bir seferde sadece diffiki tane yapabilirsiniz , ancak hepsinin eşit olup olmadığını kontrol etmek oldukça kolaydır:

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

Bir döngüyü haklı çıkarmaya yetecek kadar varsa, şöyle bir şey kullanın:

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

Elli dosyanız varsa
sakar

1
@DarenW Tabii, eğer bu kadarına sahipseniz sadece bir döngü kullanın.
Kevin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.