Разность несколько файлов, верных, если все не равные

Конфигурационные файлы системного лотка KDE могут быть найдены в ~/.kde4/share/config/plasma-desktop-appletsrc.

18
07.03.2012, 04:43
4 ответа

С разностью GNU передайте один из файлов как аргумент --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
28
27.01.2020, 19:45

Как насчет:

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

Вычисляет значение MD5 для каждого файла, затем сравнивает каждую запись со следующим, если кто-либо отличается, то возвратите нулевой (истинный) статус выхода. Это было бы намного короче, если бы это возвратило false если отличающийся:

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

Нет никакой потребности отсортировать, так как мы просто проверяем, отличается ли кто-либо.

4
27.01.2020, 19:45
  • 1
    В более короткой версии я предполагаю, что 1$ должен использоваться, поскольку 0$ содержат имя файла, которое уникально. –  xanpeng 07.03.2012, 08:33

Следующий код должен быть справедливо сам объяснительный. $# количество аргументов файла, и 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
2
27.01.2020, 19:45

Вы можете только 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
0
27.01.2020, 19:45
  • 1
    Неуклюжий, если Вы имеете пятьдесят файлов или не знаете сколько –  DarenW 22.10.2013, 00:57
  • 2
    @DarenW Несомненно, если у Вас есть это, многие просто используют цикл. –  Kevin 22.10.2013, 01:09

Теги

Похожие вопросы