여러 파일이 있는데 모든 파일의 내용이 같은지 확인하고 싶습니다.
이를 확인하기 위해 어떤 명령 줄을 사용할 수 있습니까?
사용법은 다음과 같습니다.
$ diffseveral file1 file2 file3 file4
결과:
All files equals
또는
Files are not all equals
답변
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
답변
어때요?
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}'
다른 것이 있는지 확인하기 때문에 정렬 할 필요가 없습니다.
답변
다음 코드는 설명이 명확해야합니다. $#
파일 인수의 수이며 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
답변
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