차이점 파일 헤더

차이점 파일 헤더

두 개의 파일이 있습니다. 한 파일이 다른 파일의 하위 집합인 것 같습니다. 두 번째 파일이 첫 번째 파일 내에 있는 위치를 간결하게 식별하기 위해 파일을 비교하는 방법이 있습니까?

답변1

diff -e bigger smaller 트릭을 수행하지만 출력이 "유효한 편집 스크립트"이므로 약간의 설명이 필요합니다.

나는 "bigger"와 "smaller"라는 두 개의 파일을 만들었습니다. 여기서 "smaller"의 내용은 "bigger"의 5~9행과 동일하며 "diff -e 더 큰 더 작은"을 실행하면 다음과 같은 결과를 얻을 수 있습니다.

% diff -e bigger smaller
10,15d
1,4d

이는 "'더 큰' 행 10~15를 삭제한 다음 '더 작은' 행 1~4를 삭제"하는 것을 의미합니다. 이는 "더 작은"이 "더 큰" 행의 5~9번째 행임을 의미합니다.

파일 이름을 바꾸면 상황이 더 복잡해졌습니다. "더 작은"이 "더 큰"의 하위 집합을 형성하는 경우 "d"(삭제용) 명령만 출력에 나타납니다.

답변2

시각적으로 이 작업을 수행할 수 있습니다.퓨전. 불행히도 이는 GUI 도구이지만 비교적 작은 파일에서 한 번만 수행하려는 경우에는 괜찮습니다.

아래 그림은 출력입니다 meld a b.

여기에 이미지 설명을 입력하세요.

답변3

파일이 충분히 작으면 Perl에 모두 넣고 해당 정규식 엔진이 작업을 수행하도록 할 수 있습니다.

perl -0777e '
        open "$FILE1","<","file_1";
        open "$FILE2","<","file_2";
        $file_1 = <$FILE1>;
        $file_2 = <$FILE2>;
        print "file_2 is", $file_1 =~ /\Q$file_2\E/ ? "" : "not";
        print " a subset of file_1\n";
'

이 스위치는 파일을 완전히 읽기 위해 -0777Perl이 입력 레코드 구분 기호를 정의되지 않은 값으로 설정하도록 지시합니다 .$/

답변4

문제는 "차이 파일 헤더"입니다. 한 파일이 다른 파일의 헤더라는 것을 의미하는 경우 간단한 방법 cmp으로 다음을 알 수 있습니다.

cmp big_file small_file
cmp: EOF on small_file

이는 를 읽는 동안 파일의 끝에 도달할 때까지 두 파일 간의 차이가 감지되지 않음을 나타냅니다 small_file.

그러나 작은 파일의 전체 텍스트가 내부 어디에나 나타날 수 있다는 의미이고 big_file두 파일을 모두 메모리에 넣을 수 있다고 가정하면 다음을 사용할 수 있습니다.

perl -le '
   use autodie;
   undef $/;
   open SMALL, "<", "small_file";
   open BIG, "<", "big_file";
   $small = <SMALL>;
   $big = <BIG>;
   $pos = index $big, $small;
   print $pos if $pos >= 0;
'

big_file그러면 콘텐츠가 있는 위치의 오프셋이 인쇄됩니다(예: small_file의 시작 부분에서 일치하는 경우 0). 내부 불일치가 있으면 아무것도 인쇄되지 않습니다. 오류가 발생하면 종료 상태는 0이 아닙니다.small_filebig_filesmall_filebig_file

관련 정보