여러 파일을 차등, 모두 같지 않으면 참


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 값을 계산 한 다음, 각 항목을 다음 항목과 비교하고 (있는 경우), 0 (참) 종료 상태를 리턴하십시오. 다른 경우 false를 반환하면 훨씬 짧습니다.

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

다른 것이 있는지 확인하기 때문에 정렬 할 필요가 없습니다.


1
더 짧은 버전에서는 $ 0에 고유 한 파일 이름이 포함되므로 $ 1을 사용해야한다고 생각합니다.
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

50 개의 파일이 있거나 얼마나 많은 파일을 모를 경우 서투른
DarenW

1
@DarenW 물론, 많은 사람들이 루프를 사용한다면.
Kevin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.