학교 과제가 있어요. 이 작업의 일부는 파일의 변경 사항을 확인하고 해당 변경 사항을 로그 파일에 기록하는 것입니다. 지금까지 diff
도움이 될 것이라고 생각되는 명령을 찾았습니다 . 다음 내용을 포함하는 두 개의 파일이 있다고 가정해 보겠습니다.
파일 1
orange
apple
파일 2
orange
apple
strawberry
이 경우에 사용하면 diff -c file1 file2
명령의 출력은 다음과 같습니다.
*** file1 2016-11-24 08:31:19.424712242 +0100
--- file2 2016-11-24 08:25:24.604681751 +0100
***************
*** 1,2 ****
--- 1,3 ----
orange
apple
+ strawberry
제 생각에는 "+" 기호가 있는 줄을 file1에 추가해야 동일(?)하게 만들 수 있을 것 같습니다.
이제 file1을 다음과 같이 변경한다고 가정해 보겠습니다.
orange
apple
peach
출력은 diff -c file1 file2
다음과 같습니다
*** file1 2016-11-24 08:34:50.647128312 +0100
--- file2 2016-11-24 08:25:24.604681751 +0100
***************
*** 1,3 ****
orange
apple
! peach
--- 1,3 ----
orange
apple
! strawberry
이 느낌표가 무엇을 의미하는지 이해하지 못해서 여기서 길을 잃었습니다. 갑자기 diff 명령이 그다지 유용해 보이지 않습니다. diff 명령에 대한 매뉴얼 페이지를 보려고 했지만 아무것도 찾을 수 없었습니다(아마도 제가 보지 못했을 수도 있습니다).
답변1
diff -u
당신의 임무에 필요한 것일 수도 있습니다.
예를 들어 다음을 사용하십시오 diff -u
.
michael@x071:[/home/michael]diff -u file?
--- file1 2016-11-24 07:48:41 +0000
+++ file2 2016-11-24 07:48:57 +0000
@@ -1,3 +1,3 @@
orange
apple
-peach
+strawberry
한 가지 조언 - RTM - 또는 - 설명서를 읽어보세요. 일반적으로 다른 옵션이 있습니다. 참고: diff(및 세 개의 파일을 비교할 때 diff3)의 기록 옵션은 file1을 file2로 변경하는(또는 file2를 다시 file1로 변경하는) "프로그램 inout"을 만드는 데 도움이 되는 것입니다. 이것이 모든 "버전 관리" 소프트웨어의 기본입니다.
오래 전에 기억했던 차이점 옵션:
-e
: File1을 File2로 변환하기 위해 ed 편집기에서 사용하기에 적합한 형식으로 출력을 생성합니다.-f
: ed 편집기에서 사용하기에 적합하지 않은 형식으로 출력을 생성하며,-e
이 플래그에서 생성된 것과 반대 순서로 File1을 File2로 변환하는 데 필요한 수정 사항을 보여줍니다.-n
: flags와 유사한 출력을 생성-e
하지만 역순으로 각 삽입 또는 삭제 명령에서 변경된 행 수를 표시합니다. 이는 버전 관리 시스템(RCS)에서 사용되는 형식입니다.
제가 강조하고 싶은 마지막 옵션은 비교적 말하자면 "새로운" 옵션입니다. (또한 몇 년이 지났지만 일반적으로 POSIX 구현에서는 그렇지 않습니다). "RCS"의 "ed"에 맞는 출력을 생성하는 대신 다음이 적합합니다 patch
.
-u
: 3줄 통합 컨텍스트를 사용하여 diff 명령 비교를 생성합니다. 출력은-c
컨텍스트 행이 반복되지 않고 대신 컨텍스트, 삭제된 행 및 추가된 행이 인터리브되어 표시된다는 점을 제외하면 flags 와 유사합니다.
IMHO: 두 파일이 다른지 여부보다 더 많은 것을 알고 싶을 때 키 값은 diff -c
명령보다 개선되었습니다 . cmp
나는 그것을 본 적이 없습니다(아마도 이것은 "새로운" 옵션일 수도 있습니다). 그러나 내 문제는 두 디렉터리 트리 간에 다른 파일을 재귀적으로 검색하는 것이므로 고려해야 합니다.
답변2
귀하의 질문에 대한 답변은 diff 정보 파일 노드에 있습니다 Detailed Context
.
서로 다른 줄을 둘러싸는 컨텍스트 줄은 두 개의 공백 문자로 시작됩니다. 두 파일 간에 차이가 있는 줄은 다음 표시기 중 하나로 시작하고 그 뒤에 공백 문자가 옵니다.
!
그룹의 일부인 줄 또는 두 파일 간에 변경된 여러 줄.
!
다른 파일의 해당 섹션에는 이라는 레이블이 붙은 해당 행 세트가 있습니다.
+
두 번째 파일에 "삽입된" 줄은 첫 번째 파일의 어떤 것과도 일치하지 않습니다.
-
첫 번째 파일의 "삭제된" 줄은 두 번째 파일의 어떤 항목과도 일치하지 않습니다.
정보 파일에는 헤더 라인을 포함하여 출력 형식에 대한 광범위한 정보가 포함되어 있습니다. 다시 읽어보시길 권합니다.
답변3
의 출력은 diff
청크로 구성되며, 각 청크는 일련의 변경 사항에 해당합니다. 이 ***************
줄은 해당 블록의 시작을 표시합니다.
각 청크는 파일 내의 컨텍스트를 제공합니다. *** 1,3 ****
은 다음 내용이 첫 번째 파일의 1~3번째 줄이고, --- 1,3 ----
다음 내용이 두 번째 파일의 1~3번째 줄이라는 의미입니다.
첫 번째 열의 빼기 기호는 -
삭제된 행을 나타내고 더하기 기호는 +
추가된 행을 나타냅니다. 느낌표는 !
변경된 행을 표시합니다.
귀하의 경우 첫 번째 파일이 두 번째 파일 peach
로 변경되었습니다 .strawberry