file1이 file2의 접두사인지 확인하는 방법?


13

크기가 124665 및 124858 인 두 개의 파일이 있고 file1이 file2의 접두사인지 여부를 확인하려고합니다.

답변:


11

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

@ StéphaneChazelas 왜 여기 cmp보다 나은지 설명해 주 diff시겠습니까?
Joseph R.

7
때문에 cmp하면서, 차이를 발견하자마자 간단한 바이트 비교에 바이트, 및 반환하지 않습니다 diff당신이 걱정하지 않는다 두 파일 사이의 모든 차이를 보여주기 위해 복잡한 알고리즘을 사용하려고하는 텍스트 유틸리티입니다.
Stéphane Chazelas

12

시스템에 cmpGNU 명령 이있는 경우 diffutils한 가지 옵션은

cmp -n 124665 file1 file2

두 파일의 최대 124665 바이트를 비교하여 서로 다르거 나보다 일반적으로보고

cmp -n "$(wc -c < file1)" file1 file2

@StephaneChazelas 두 번째로 여기에 자신을 추측하지만 $(stat -c %s file1)바이트 크기 를 제안하는 것이 더 좋을까요? 않습니다 wc실제로 열고 바이트 수를 얻을 수있는 전체 파일을 처리?
스틸 드라이버

2
아니요. 대부분의 wc구현은 해당 사례를 최적화하고 fstat()(또는 / 및 a lseek(SEEK_END))를 수행하므로 최대한 효율적입니다. 반면에, 이것은 stat -cGNU 고유의 것입니다.
Stéphane Chazelas 2016 년

1
비록 GNU- 특정을 요구한다면, GNU- 특정 cmp이라고 합리적으로 가정 할 수 있습니다 stat.
Barmar

3

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비슷한 작업 을 수행한다고 가정 하지만 확인하지 않았습니다.


1
cmpGNU 전용 명령도 아니고 명령도 시작하지 않았으며 이미 70 년대 초 유닉스의 첫 번째 버전에있었습니다. 그러나 -n옵션은 GNU에 따라 다릅니다.
Stéphane Chazelas 2016 년

당신은 할 수 있습니다cmp file1 file2 2>&1 | grep EOF on file1
David Z

@ StéphaneChazelas : 맞습니다. 나는 이것이 cmpGNU에 고유 하다는 것을 의미하는 것이 아니라, GNU cmp가 내가 시도한 유일한 버전 이라는 것을 의미 했습니다. 명확하게하기 위해 문장을 추가했습니다.
Nate Eldredge

@DavidZ : 예, 가능하지만 조금 덜 강력 해집니다. 사용자가 제공 한 두 개의 파일로이 작업을 수행하려고하는데 그 중 하나는 이름이 지정 file1되고 다른 하나는 이름이 지정 file12됩니다. (또는 더 나쁘지만, 두 번째 파일의 이름이 EOF on file1어떻게됩니까?) 이것을 강력하게 사용하여 해결 cmp하는 것은 C에서 명백한 5 줄 프로그램을 작성하는 것보다 훨씬 더 어려울 것입니다.
Nate Eldredge

그러나 C 프로그램이 실용적이지 않은 상황이있을 수 있습니다. 그리고 출력 cmp이 너무 엄격하게 제한되어 있기 때문에 상당히 견고하게 만드는 것은 어렵지 않습니다 . 전체 행과 일치시키기 위해 -xon 옵션을 사용하면 grep가장 이례적인 경우를 제외하고 처리됩니다 (예 : 파일 이름의 줄 바꿈).
David Z
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.