폴더나 파일이 같은지 다른지 출력하려면 어떻게 해야 할까요? 다른 내용까지 보려면 어떻게 해야 할까요? 리눅스의 diff 명령어는 그것을 위한 명령어입니다. 이런 유틸은 인터넷에도 꽤 많이 있을 정도인데요. 저 같은 경우, 백준에서 (흔히 올라오는 질문 중 하나인) 2개의 소스코드 중 하나는 맞고 하나는 틀리다고 할 경우에 어느 부분이 어떻게 다른지부터 체크하는 편입니다. 이 때 쓸 수 있습니다.
먼저 diff가 어떻게 구현되었는지에 대한 것은, 아니면 그에 대한 알고리즘들은, 나중에 살펴보기로 하고, 이번 시간에는 폴더가 어떻게 다른지, 그리고 파일이 어떻게 다른지 알아내는 방법을 알아보도록 하겠습니다. 먼저, 1과 2 디렉토리가 있습니다. tree 명령어로, 폴더 내에 어떠한 것들이 있는지 출력해 봅시다.
먼저 1에는 1.txt랑 2가 있는데요. 2 안에 2.c가 있습니다.
2에는 1.txt랑 2, 3이 있는데요. 2 안에는 1.txt와 2.c가 있습니다.
-r 옵션을 주면, 폴더의 경우 재귀적으로 탐색해서 다른 부분을 찾아내는 것입니다. 재귀 탐색이라고 해서 어렵게 생각하실 필요는 전혀 없습니다. 전위 탐색, 후위 탐색, 중위 탐색 이런 것을 써서 폴더 내에 있는 것을 전수 탐색하는 것을 의미해요. 이렇게 search 하면서 다른 부분을 출력하는데요.
먼저, 1/1.txt랑 2/1.txt가 다르다고 되어 있어요. 1.txt의 2번째 줄에는 int main rarara가 있다는 것을 의미합니다. 그리고 Only in 2/2가 보이는데요. 이는, 2 디렉토리의 2 디렉토리에 1.txt가 1에는 없다는 겁니다. 또 2 디렉터리에 3 디렉터리가 안에 들어있는데요. 1 디렉토리에는 아예 없음을 의미합니다.
이제 각 파일에 대해서 비교해 보도록 하겠습니다.
먼저 1.txt, 2.txt, 3.txt에 대한 내용을 출력해 보겠습니다. 그러면 1.txt와 2.txt가 약간 다르고, 1.txt와 3.txt가 같다는 것을 알 수 있어요. 그런데 1과 2는 어디가 다를까요? 맨 마지막 줄인 3번째가 조금 다릅니다.
먼저, diff 1.txt 2.txt를 입력해 봅시다. 이 때 old version은 1.txt고, new version은 2.txt인데요. <는 old에서 new로 바뀌었을 때, 제거된 부분을, >은 추가된 부분을 의미합니다.
이제, -u 옵션을 줘 봅시다. 그러면 바뀐 행의 주변 부분까지도 출력하는데요. 여기서 -나 +가 없는 것은 공통된 부분입니다. 그리고 -는 1.txt에서 2.txt로 바꾸어야 할 때 제거되어야 하는 부분, +은 추가되어야 하는 부분을 의미합니다. 뭔가 diffchecker나 github에서 많이 본 패턴 같다면.
두 파일이 같다면 다른 부분을 출력하지는 않습니다.
wiki에 따르면 diff 명령어는 LCS를 기반으로 작동된다고는 합니다. LCS라고 하면, 예를 들자면, abcde랑 acdbe가 있다면, 공통 부분을 abe가 아니라, acde 이런 식으로 찾는다는 이야기인데요. 이것까지 실험을 한 번 해 봅시다.
2.txt에 chogahui, is, my, dog라는 문자열, 4줄을 추가하였습니다.
그러면 다른 부분이 이렇게 5개가 나온다는 것을 알 수 있어요. <는 제거 되어야 하는 부분, >은 추가 되어야 하는 부분을 의미합니다. 이걸 -u 옵션으로 출력해 봅시다.
요렇게 나옵니다. 이제 1.txt를 아래와 같이 바꿔 보겠습니다.
my, chogahui, is, dog. 그러면 공통 부분 문자열이라고 해야 하나요? 앞 글자만 따 보겠습니다. 2.txt에는 CIMD라고 되어 있고, 1.txt에는 MCID라고 되어 있어요. 그러면 LCS는 CID일 건데요. 이것을 공통으로 봅니다.
1번째 줄, 2번째 줄, chogahui, is, dog를 공통으로 보았기 때문에, 나머지 문자열에 대해서는 +나 -가 붙습니다. 이 부분에 대해서는, 나중에 diff에 대해서 뜯어볼 때 다시 이야기 해 보도록 하겠습니다.
'OS > 리눅스' 카테고리의 다른 글
리눅스 getpid getppid 함수 : 자신과 부모 프로세스 번호를 얻어온다. (2) | 2020.01.04 |
---|---|
좀비 프로세스 : 종료 되었지만 리소스는 차지하고 있다. (6) | 2019.12.30 |
리눅스 alias unalias 명령어 : 별칭을 추가하고 제거한다. (2) | 2019.12.17 |
리눅스 ln 명령어 : 파일의 링크를 만든다. (4) | 2019.11.08 |
리눅스 waitpid 함수 : 자식 프로세스를 기다린다. (6) | 2019.10.15 |
최근댓글