나는 가지고있다file1.txt
this is the original text
line2
line3
line4
happy hacking !
그리고file2.txt
this is the original text
line2
line4
happy hacking !
GNU is not UNIX
그렇게 하면: diff file1.txt file2.txt
나는 다음을 얻습니다:
3d2
< line3
5a5
> GNU is not UNIX
출력은 일반적으로 어떻게 해석됩니까? <
삭제라는 뜻인 것 같은데 무슨 3d2
뜻 인가요 5a5
?
만약 내가한다면:
$ diff -u file1.txt file2.txt
--- file1.txt 2013-07-06 17:44:59.180000000 +0200
+++ file2.txt 2013-07-06 17:39:53.433000000 +0200
@@ -1,5 +1,5 @@
this is the original text
line2
-line3
line4
happy hacking !
+GNU is not UNIX
결과는 더욱 명확해졌습니다. 하지만 그 결과는 무엇을 @@ -1,5 +1,5 @@
의미합니까?
답변1
첫 번째 diff
출력(소위 "정규 차이")의 의미는 다음과 같습니다.
<
- file1.txt의 행을 나타냅니다.
>
- file2.txt의 행을 나타냅니다.
3d2
5a5
영향을 받은 줄 번호와 수행된 작업을 나타냅니다 . d
삭제를 나타내고 a
추가를 나타냅니다( c
변경을 나타냄). 문자 왼쪽의 숫자는 file1.txt의 줄 번호이고, 오른쪽의 숫자는 file2.txt의 줄 번호입니다. 그러면 3d2
file1.txt의 3번째 줄이 삭제되었고 2번째 줄이 file2.txt에 있다는 것을 알 수 있습니다(또는 더 좋게 말하면, 삭제 후 줄 카운터가 2번째 줄로 돌아갑니다). 5a5
file1.txt의 라인 5(이전 작업에서 라인을 삭제한 후 실제로 비어 있음)에서 시작하여 해당 라인을 추가했으며 추가된 라인은 file2.txt의 라인 5라는 것을 알려줍니다.
명령의 출력 형식은 diff -u
약간 다릅니다(소위 "통합 diff" 형식). 여기서는 diff
두 개의 별도 텍스트가 아닌 하나의 텍스트로 제공됩니다. 이 줄의 @@ -1,5 +1,5 @@
일부는 -1,5
file1.txt와 관련되고 일부 +1,5
는 file2.txt와 관련됩니다. 그들은 이것이 diff
file1.txt의 라인 1에서 시작하여 5라인 길이의 텍스트를 표시할 것이라고 말합니다 . file2.txt에서도 마찬가지입니다. diff
1행부터 시작하는 5행이 표시됩니다.
이미 말했듯이 두 파일의 줄은 함께 표시됩니다.
this is the original text
line2
-line3
line4
happy hacking !
+GNU is not UNIX
이는 -
file1.txt에서 삭제된 라인과 +
추가된 라인을 나타냅니다.
답변2
일반화하다:
가 주어지면 diff file1 file2
행 <
이 에서 손실되었음을 나타냅니다 file2
. >
이는 행이 에서 손실되었음을 나타냅니다 file1
. 무시할 수 있지만 3d2
명령과 함께 자주 사용됩니다.5a5
patch
diff
완전한 답변:
많은 *nix 유틸리티는 TeXinfo 매뉴얼과 더 간단한 man
페이지를 제공합니다. info command
예를 들어 를 실행하여 이러한 항목에 액세스할 수 있습니다 info diff
. 이 경우 관심 있는 부분은 다음과 같습니다.
2.4.2 일반 포맷에 대한 자세한 설명
일반 출력 형식은 하나 이상의 차이점 세트로 구성됩니다. 각 블록은 파일의 다른 영역을 표시합니다. 일반 형식의 잘생긴 남자는 다음과 같습니다.
CHANGE-COMMAND
< FROM-FILE-LINE
< FROM-FILE-LINE...
---
> TO-FILE-LINE
> TO-FILE-LINE...
변경 명령에는 세 가지 유형이 있습니다. 각 파일에는 첫 번째 파일의 줄 번호 또는 쉼표로 구분된 줄 범위, 수행할 변경 유형을 나타내는 단일 문자, 두 번째 파일의 줄 번호 또는 쉼표로 구분된 줄 범위가 포함됩니다. 모든 줄 번호는 각 파일의 원래 줄 번호입니다. 변경 명령의 유형은 다음과 같습니다.
`LaR'
Add the lines in range R of the second file after line L of the
first file. For example, `8a12,15' means append lines 12-15 of
file 2 after line 8 of file 1; or, if changing file 2 into file 1,
delete lines 12-15 of file 2.
`FcT'
Replace the lines in range F of the first file with lines in range
T of the second file. This is like a combined add and delete, but
more compact. For example, `5,7c8,10' means change lines 5-7 of
file 1 to read as lines 8-10 of file 2; or, if changing file 2 into
file 1, change lines 8-10 of file 2 to read as lines 5-7 of file 1.
`RdL'
Delete the lines in range R from the first file; line L is where
they would have appeared in the second file had they not been
deleted. For example, '5,7d3' means delete lines 5-7 of file 1;
or, if changing file 2 into file 1, append lines 5-7 of file1
after line 3 of file 2.
답변3
1) 진행 상황을 기억하는 데 도움이 되도록 파일 매개변수의 이름을 다음과 같이 바꿉니다.
대신에:
diff f1 f2 # f1=file 1, and f2=file2
생각하다
diff file-to-edit file-with-updates
결과 기본값:편집할 파일, 다음에서 업데이트됨업데이트 파일.
2) 또한 이러한 명령 이름 변경은 무슨 일이 일어나고 있는지 생각하는 데 도움이 될 수 있습니다.
디대표하다디그렇긴 하지만'제거하다'무슨 일이 일어나고 있는지 더 명확하게 만듭니다.
ㅏ대표하다ㅏ으응,...하지만'끼워 넣다'무슨 일이 일어나고 있는지 더 명확하게 만듭니다.
씨대표하다씨옷걸이=디+ㅏ또는 "삭제+삽입".
다음과 같이 사용하세요:
2,4디1 또는 일반 D(들)-디-N=디삭제('제거하다') D 라인. 그런 다음 두 라인의 N개 라인을 동기화합니다.
4ㅏ2,4 또는 일반적으로 N-ㅏ-U(s) = 라인 N에서,ㅏdd('끼워 넣다') 행 U를 업데이트합니다.
참고: 이 두 매개변수는 거의 대칭입니다. 왼쪽에서 오른쪽으로만 반전되어 있습니다.
2,4씨5,6 또는 일반 R(들)-씨-U(s) = R(s) 행을 삭제하고 해당 위치에 업데이트된 U(s) 행을 삽입합니다.
예를 들어:
4ㅏ2,4는 4부터 시작하여 업데이트된 행 2-4를 추가(삽입)하는 것을 의미합니다.(즉, "2,4"는 2, 3, 4행을 의미합니다.)
2,4디1은 2~4행(2, 3, 4)을 삭제한다는 의미입니다.
2,4씨5,6은 행 2-4(2, 3, 4)를 삭제하고 업데이트된 행 5-6(5, 6)을 삽입함을 의미합니다.
답변4
나는 다음을 사용하는 것이 좋습니다:
diff -rupP file1.txt file2.txt > result.patch
그러면, 읽어보면 result.patch
그 차이를 즉시 알 수 있을 것입니다.
명령줄 스위치의 의미는 다음과 같습니다.
-아르 자형:재귀
-유: 줄 번호 표시
-피(작음): C 함수의 차이점을 보여줍니다.
-피(대문자) : 파일이 여러 개인 경우 전체 경로를 표시합니다.