여러 파일을 비교하고 같지 않으면 true를 반환합니다.

여러 파일을 비교하고 같지 않으면 true를 반환합니다.

파일이 많고 이 파일이 모두 동일한 내용을 가지고 있는지 확인하고 싶습니다.

어떤 명령줄을 사용하여 확인할 수 있나요?

사용법은 다음과 같습니다.

$ diffseveral file1 file2 file3 file4

결과:

All files equals

또는

Files are not all equals

답변1

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

평소와 같이 와일드카드를 사용할 수 있습니다. 예를 들어, 현재 디렉터리에 file1, 및 가 file2포함 된 경우 다음 예에서는 , 및 를 비교합니다 .file3file4file2file3file4file1

$ diff -q --from-file file*; echo $?

diff가 여러 번 읽을 수 있으므로 "파일에서"는 파이프가 아닌 일반 파일이어야 합니다.

답변2

어때요?

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}'

차이점이 있는지 확인하는 것이므로 정렬이 필요하지 않습니다.

답변3

아래 코드는 설명이 매우 명확해야 합니다. $#파일 매개변수의 수이며 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

답변4

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

관련 정보