diff 명령어는 리눅스 셸에서 파일이나 디렉터리를 손쉽게 비교할 수 있는 도구입니다. 이 글에서는 diff의 기본 사용법을 예제와 함께 자세히 살펴보겠습니다.
diff 명령어는 두 개의 파일 또는 디렉터리를 한 줄씩 비교하여 그 차이점을 출력합니다.
파일이나 디렉터리를 비교해야 하는 이유
- 이름이 같고 내용이 비슷해 보이는 두 파일의 실제 차이점을 확인하고 싶을 때
- 프로젝트 코드의 이전 버전과 새 버전 사이에 어떤 변경 사항이 있는지 파악하고 싶을 때
- 다른 드라이브로 복사한 많은 파일들이 손상 없이 제대로 복사되었는지 검증하고 싶을 때
- 친구와 동일한 폴더 구조를 공유하고 있고, 일부 파일만 수정한 경우 전체를 다시 보내지 않고 변경된 부분만 패치로 만들어 전송하면 상대방은 다운로드 없이 최신 상태로 업데이트할 수 있습니다.
파일을 비교하는 이유는 사람마다 다양하겠지만, 이제 diff의 실제 사용법을 알아보겠습니다.
diff 기본 문법
diff OPTIONS FILES
참고할 점:
- OPTIONS(옵션)는 선택 사항이며 아래 표의 옵션들을 지정할 수 있습니다.
- FILES는 비교할 두 파일의 경로이며, 공백으로 구분하여 입력합니다.
diff 주요 옵션
아래는 diff 명령어에서 가장 많이 사용되는 OPTIONS 목록입니다(사용자 매뉴얼 기준):
| 옵션 | 설명 |
|---|---|
| -q, --brief | 파일이 서로 다를 때만 결과를 보고함 |
| -s, --report-identical-files | 두 파일이 동일할 때도 보고함 |
| -u, -U NUM, --unified[=NUM] | NUM줄(기본값 3)의 통합 컨텍스트를 출력함 |
| -N, --new-file | 없는 파일은 빈 파일로 간주함 |
| -l, --paginate | 출력을 'pr'을 통해 페이지 단위로 나눔 |
| -r, --recursive | 발견된 하위 디렉터리까지 재귀적으로 비교함 |
| --no-dereference | 심볼릭 링크를 따라가지 않음 |
| -a, --text | 모든 파일을 텍스트로 취급함 |
| -d, --minimal | 더 작은 변경 집합을 찾기 위해 최선을 다함 |
| --speed-large-files | 대용량 파일과 흩어진 소규모 변경이 많다고 가정하고 처리함 |
전체 옵션이 궁금하다면 온라인 매뉴얼을 참고하거나, 명령줄에서 아래 명령어를 실행하세요:
man diff
실전 예제
리눅스에서 두 파일 비교하기
diff 명령어의 가장 기본적인 사용법으로, 지정한 두 파일의 차이점을 콘솔에 출력합니다:
diff file1.txt file2.txt
결과를 파일로 저장하기
패치를 만들 필요 없이 단순히 차이점만 확인하고 싶다면, 출력을 파일로 리디렉션하는 것이 유용합니다. 변경 사항이 많을 경우 터미널 화면에서 잘리는 것을 방지할 수 있습니다:
diff -q file1.txt file2.txt > differences.txt
이 명령은 differences.txt 파일을 생성(또는 덮어쓰기!)하며, 두 파일 간의 차이점 요약이 저장됩니다.
여기서 -q 옵션을 추가하면 차이가 있는 파일만 표시되므로, 동일한 파일은 언급되지 않아 결과를 한눈에 파악하기 쉽습니다.
리눅스에서 디렉터리 비교하기
-r(재귀적) 옵션을 사용하면 디렉터리의 내용까지 비교할 수 있습니다:
diff -r -q /path/to/dir1 /path/to/dir2
마찬가지로 -q 옵션을 함께 사용해 차이가 있는 항목만 표시했습니다.
대용량 파일 또는 대용량 파일이 포함된 디렉터리 비교
diff는 비교 대상인 모든 파일을 읽고 대조해야 하는 집약적인 작업이라 시간이 오래 걸릴 수 있습니다.
--speed-large-files 옵션을 사용하면 diff의 알고리즘이 대용량 파일 비교에 맞게 조정되어 처리 속도가 다소 향상됩니다.
파일용 패치 만들기
패치(patch)란 두 파일 간의 차이점 목록으로, 첫 번째 파일의 다른 사본에 적용하면 두 번째 파일과 동일하게 만들 수 있습니다. 다음 명령어로 패치를 생성할 수 있습니다:
diff -u file1.txt file2.txt > update.patch
-u 옵션은 차이점을 통합(unified) 형식으로 출력하며, 이 형식은 patch 명령어가 원본 파일에 변경 사항을 반영할 때 사용됩니다.
친구나 동료가 여러분의 데이터나 프로그래밍 코드를 사용 중일 때, 전체 데이터셋이나 애플리케이션을 다시 보내지 않고도 업데이트 내역만 전달할 수 있어 매우 유용합니다.
파일에 패치 적용하기
패치를 받은 친구는 다음 patch 명령어로 이를 적용할 수 있습니다:
patch original.txt < update.patch
파일 패치 되돌리기
실수로 잘못 적용했다면 -R 옵션으로 역방향 실행하여 패치를 되돌릴 수 있습니다:
patch -R original.txt < update.patch
디렉터리용 패치 만들기
다음 명령어는 -r(재귀적), -u(통합 형식), -N(없는 파일을 빈 파일로 취급) 옵션을 조합하여 디렉터리 전체의 패치를 생성합니다:
diff -ruN originalDir updatedDir > update.patch
디렉터리에 패치 적용하기
-p0 옵션을 사용하면 패치가 생성 당시와 동일한 디렉터리 구조에 그대로 적용됩니다:
patch -p0 < update.patch
디렉터리 패치 되돌리기
마지막으로, 디렉터리에 적용한 패치를 되돌리거나 역방향으로 실행하는 방법입니다:
patch -R -p0 originalFile < patchFile