Розрізняйте кілька файлів, правда, якщо всі не рівні


18

У мене є декілька файлів, я хочу перевірити, чи всі ці файли мають однаковий вміст.

Який командний рядок я міг би використати для перевірки?

Використання може бути таким, як:

$ diffseveral file1 file2 file3 file4

Результат:

All files equals

АБО

Files are not all equals

Відповіді:


27

За допомогою GNU diff передайте один із файлів як аргумент --from-fileта будь-яку кількість інших як операнд:

$ 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

Як щодо:

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

Обчислює значення MD5 для кожного файлу, потім порівнює кожен запис із наступним, якщо такі є різними, то повертає нульовий (справжній) статус виходу. Це було б набагато коротше, якби він повернув помилку, якщо відрізнявся:

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

Не потрібно сортувати, оскільки ми просто перевіряємо, чи є різні.


1
У коротшій версії, мабуть, слід використовувати $ 1, оскільки $ 0 містить унікальне ім'я файлу.
xanpeng

2

Наступний код повинен бути досить пояснювальним. $#- це кількість аргументів файлу і shiftпросто споживає їх по одному. Використовує cmp -sдля тихого байтового порівняння.

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

Можна одночасно лише diffдвоє, але перевірити, чи всі вони рівні:

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

Якщо у вас достатньо для виправдання циклу, використовуйте щось подібне:

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

Незграбно, якщо у вас п’ятдесят файлів, або не знаєте, скільки
DarenW

1
@DarenW Звичайно, якщо у вас багато хто просто використовує цикл.
Кевін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.