답변:
file1
변수에 크기가 FILE1_SZ
있고 head
구현에서 (비표준) -c
옵션을 지원 한다고 가정합니다 .
if head -c "$FILE1_SZ" file2 | cmp -s - file1; then
echo "file1 is a prefix of file2"
else
echo "file1 is not a prefix of file2"
fi
cmp
하면서, 차이를 발견하자마자 간단한 바이트 비교에 바이트, 및 반환하지 않습니다 diff
당신이 걱정하지 않는다 두 파일 사이의 모든 차이를 보여주기 위해 복잡한 알고리즘을 사용하려고하는 텍스트 유틸리티입니다.
시스템에 cmp
GNU 명령 이있는 경우 diffutils
한 가지 옵션은
cmp -n 124665 file1 file2
두 파일의 최대 124665 바이트를 비교하여 서로 다르거 나보다 일반적으로보고
cmp -n "$(wc -c < file1)" file1 file2
$(stat -c %s file1)
바이트 크기 를 제안하는 것이 더 좋을까요? 않습니다 wc
실제로 열고 바이트 수를 얻을 수있는 전체 파일을 처리?
wc
구현은 해당 사례를 최적화하고 fstat()
(또는 / 및 a lseek(SEEK_END)
)를 수행하므로 최대한 효율적입니다. 반면에, 이것은 stat -c
GNU 고유의 것입니다.
cmp
이라고 합리적으로 가정 할 수 있습니다 stat
.
GNU cmp
는보다 쉬운 방법으로 문제를 해결할 수 있습니다.
cmp file1 file2
네 가지 가능한 출력이 있습니다 (일부 종류의 오류 제외).
출력 없음 : 파일이 동일합니다.
cmp: EOF on file1
: file1은 file2의 접두사입니다.
cmp: EOF on file2
: file2는 file1의 접두사입니다.
file1 file2 differ: byte NNN, line MMM
: 다른 것의 접두사도 아닙니다.
불행히도 스크립트에서 사용하기에는 약간 어색합니다.이 경우 종료 코드에서 구별되지 않기 때문입니다. 또한 EOF on file1
메시지는 stderr로 이동하고 file1 file2 differ
메시지는 stdout으로 이동합니다.
다른 버전의 cmp
비슷한 작업 을 수행한다고 가정 하지만 확인하지 않았습니다.
cmp
GNU 전용 명령도 아니고 명령도 시작하지 않았으며 이미 70 년대 초 유닉스의 첫 번째 버전에있었습니다. 그러나 -n
옵션은 GNU에 따라 다릅니다.
cmp file1 file2 2>&1 | grep EOF on file1
cmp
GNU에 고유 하다는 것을 의미하는 것이 아니라, GNU cmp
가 내가 시도한 유일한 버전 이라는 것을 의미 했습니다. 명확하게하기 위해 문장을 추가했습니다.
file1
되고 다른 하나는 이름이 지정 file12
됩니다. (또는 더 나쁘지만, 두 번째 파일의 이름이 EOF on file1
어떻게됩니까?) 이것을 강력하게 사용하여 해결 cmp
하는 것은 C에서 명백한 5 줄 프로그램을 작성하는 것보다 훨씬 더 어려울 것입니다.
cmp
이 너무 엄격하게 제한되어 있기 때문에 상당히 견고하게 만드는 것은 어렵지 않습니다 . 전체 행과 일치시키기 위해 -x
on 옵션을 사용하면 grep
가장 이례적인 경우를 제외하고 처리됩니다 (예 : 파일 이름의 줄 바꿈).
cmp
보다 나은지 설명해 주diff
시겠습니까?