답변:
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당신이 걱정하지 않는다 두 파일 사이의 모든 차이를 보여주기 위해 복잡한 알고리즘을 사용하려고하는 텍스트 유틸리티입니다.
시스템에 cmpGNU 명령 이있는 경우 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 -cGNU 고유의 것입니다.
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비슷한 작업 을 수행한다고 가정 하지만 확인하지 않았습니다.
cmpGNU 전용 명령도 아니고 명령도 시작하지 않았으며 이미 70 년대 초 유닉스의 첫 번째 버전에있었습니다. 그러나 -n옵션은 GNU에 따라 다릅니다.
cmp file1 file2 2>&1 | grep EOF on file1
cmpGNU에 고유 하다는 것을 의미하는 것이 아니라, GNU cmp가 내가 시도한 유일한 버전 이라는 것을 의미 했습니다. 명확하게하기 위해 문장을 추가했습니다.
file1되고 다른 하나는 이름이 지정 file12됩니다. (또는 더 나쁘지만, 두 번째 파일의 이름이 EOF on file1어떻게됩니까?) 이것을 강력하게 사용하여 해결 cmp하는 것은 C에서 명백한 5 줄 프로그램을 작성하는 것보다 훨씬 더 어려울 것입니다.
cmp이 너무 엄격하게 제한되어 있기 때문에 상당히 견고하게 만드는 것은 어렵지 않습니다 . 전체 행과 일치시키기 위해 -xon 옵션을 사용하면 grep가장 이례적인 경우를 제외하고 처리됩니다 (예 : 파일 이름의 줄 바꿈).
cmp보다 나은지 설명해 주diff시겠습니까?