Lệnh diff trong Linux là công cụ dòng lệnh dùng để so sánh nội dung hai file hoặc thư mục theo từng dòng và hiển thị rõ các điểm khác nhau giữa chúng, từ những dòng bị thêm, xóa cho đến các đoạn nội dung đã được chỉnh sửa. Trong bài viết này, mình sẽ cùng bạn tìm hiểu chi tiết về cú pháp, các tùy chọn thường dùng, cách đọc kết quả diff qua nhiều ví dụ thực tế và một số lưu ý quan trọng khi áp dụng lệnh diff trong Linux để so sánh file cấu hình, mã nguồn và thư mục.
Những điểm chính
Quan điểm của mình: Trong quản trị hệ thống Linux và DevOps, việc kiểm soát sự thay đổi của các file cấu hình hay mã nguồn là nhiệm vụ bắt buộc. Lệnh diff không đơn thuần là một công cụ so sánh văn bản thông thường, mà nó là nền tảng để bạn kiểm tra tính toàn vẹn của hệ thống, rà soát lỗi sau khi cập nhật và tạo ra các bản vá (patch) nhanh chóng. Việc làm chủ diff cùng các tùy chọn nâng cao sẽ giúp kỹ thuật viên xử lý sự cố chính xác hơn, tránh những sai sót thủ công gây gián đoạn dịch vụ. Dưới đây là các nội dung chính trong bài viết giúp bạn hiểu lệnh diff hơn:
- Khái niệm: Hiểu rõ lệnh
difflà công cụ dùng để so sánh nội dung hai tệp tin, giúp bạn nhanh chóng xác định các dòng khác biệt để kiểm tra thay đổi hoặc tạo file patch. - Cú pháp lệnh diff: Hiểu cách dùng các tùy chọn và chỉ định đối tượng (file/thư mục) để điều khiển và thực hiện việc so sánh nội dung.
- Các tùy chọn lệnh diff: Giúp tùy chỉnh cách so sánh và định dạng hiển thị kết quả, làm cho việc đối chiếu file hoặc thư mục trở nên linh hoạt và hiệu quả hơn.
- Các ký hiệu chuyên dụng: Hiểu rõ ý nghĩa của các ký hiệu, giúp bạn đọc và diễn giải chính xác các thay đổi mà lệnh
diffchỉ ra. - Ví dụ thực tế lệnh diff: Giúp người đọc biết cách so sánh file, thư mục, tùy chỉnh output và tạo file patch hiệu quả qua các tình huống cụ thể.
- Lưu ý quan trọng: Nắm được các lưu ý và các lỗi thường gặp, giúp bạn sử dụng lệnh một cách an toàn, chính xác và tránh các kết quả không mong muốn.
- Câu hỏi thường gặp: Giải đáp các thắc mắc liên quan đến lệnh
difftrong Linux.
Lệnh diff trong Linux là gì?
Lệnh diff trong Linux là dòng lệnh dùng để so sánh nội dung hai file theo từng dòng, từ đó hiển thị rõ những điểm khác nhau giữa chúng để người dùng dễ kiểm tra, thay đổi trong mã nguồn, file cấu hình hoặc dữ liệu văn bản. Khi chạy diff, công cụ sẽ phân tích hai file và cho biết những dòng nào cần thêm, xóa hoặc chỉnh sửa để tệp thứ nhất trở thành bản sao nội dung của tệp thứ hai.

Các dòng thuộc file đầu thường được đánh dấu bằng ký hiệu <, còn các dòng chỉ có trong file thứ hai được đánh dấu bằng >. Nhờ cơ chế thể hiện các thay đổi dưới dạng “chỉ dẫn chỉnh sửa”, output của diff có thể được chuyển thành file patch và sử dụng cùng lệnh patch để áp dụng hàng loạt thay đổi từ một phiên bản tệp sang phiên bản khác một cách có kiểm soát.
Cú pháp của lệnh diff trong Linux
Cú pháp lệnh diff cho biết cách chỉ định các tùy chọn và danh sách tệp hoặc thư mục cần so sánh, từ đó điều khiển định dạng hiển thị và phạm vi nội dung được đối chiếu giữa hai bên.
Cú pháp tổng quát của lệnh diff: diff [OPTION]… FILES.
Trong đó:
OPTION: Là các tham số tùy chọn cho phép thay đổi cách hiển thị và quy tắc so sánh, ví dụ chọn định dạngnormal/context/unified, bỏ qua phân biệt hoa – thường, bỏ qua khoảng trắng, chỉ báo khác/giống mà không hiển thị chi tiết, hoặc so sánh thư mục đệ quy.FILES: Là hai đối tượng đầu vào cần so sánh, thường là hai file văn bản (file1 file2), nhưng cũng có thể là hai thư mục (dir1 dir2) khi cần kiểm tra sự khác nhau về cấu trúc và nội dung giữa hai cây thư mục.
Các tùy chọn thường dùng của lệnh diff Linux
Theo kinh nghiệm của mình, điều làm nên sự khác biệt giữa người dùng diff thông thường và người dùng thành thạo chính là cách vận dụng các tùy chọn. Chúng giúp bạn nhanh chóng lọc bỏ ‘nhiễu’ (như khoảng trắng, chữ hoa/thường) và tùy chỉnh đầu ra sao cho phù hợp nhất với từng tình huống kiểm tra file cấu hình, mã nguồn hoặc thư mục. Dưới đây là các tùy chọn thường dùng của lệnh diff Linux:
| Tùy chọn | Ý nghĩa | Mô tả chi tiết |
| -u | Định dạng unified | Hiển thị khác biệt trong định dạng unified, gom các khối thay đổi (hunk) kèm một số dòng ngữ cảnh trước sau, thường dùng khi tạo patch hoặc review thay đổi vì nội dung gọn và dễ theo dõi. |
| -c | Định dạng context | Trả kết quả theo định dạng context, hiển thị nhiều dòng ngữ cảnh xung quanh phần thay đổi, giúp quan sát sự khác nhau trong bối cảnh đoạn mã hoặc cấu hình rộng hơn. |
| -i | Bỏ qua hoa/thường | Khi so sánh nội dung, lệnh diff sẽ không phân biệt chữ hoa và chữ thường, các khác biệt chỉ về case sẽ không được xem là thay đổi. |
| -w | Bỏ qua khoảng trắng | Bỏ qua toàn bộ sự khác nhau về khoảng trắng (space, tab) khi so sánh, hữu ích khi file chỉ khác nhau về canh lề hoặc format nhưng nội dung thực tế giống nhau. |
| -q | Chế độ báo cáo ngắn gọn | Chỉ cho biết hai file có khác nhau hay không mà không hiển thị chi tiết nội dung chênh lệch, phù hợp khi chỉ cần kiểm tra nhanh trạng thái thay đổi. |
| -r | So sánh thư mục đệ quy | So sánh nội dung hai thư mục theo kiểu đệ quy, duyệt vào các thư mục con để phát hiện file bị thiếu, thêm mới hoặc thay đổi giữa hai cây thư mục. |
| -s | Báo file giống hệt nhau | Khi hai file hoàn toàn giống nhau, diff sẽ trả về thông báo xác nhận thay vì im lặng, giúp dễ kiểm tra kết quả khi so sánh nhiều cặp file. |
| -B, –ignore-blank-lines | Bỏ qua dòng trống | Không coi các dòng trống hoặc sự khác nhau chỉ do dòng trống là thay đổi, giảm nhiễu khi so sánh file có nhiều khoảng cách dòng. |
| –ignore-all-space | Bỏ qua mọi khác biệt về khoảng trắng | Bỏ qua toàn bộ sự khác nhau về số lượng và vị trí ký tự trắng, tập trung vào phần ký tự không phải khoảng trắng để đánh giá thay đổi nội dung. |
Ký hiệu chuyên dụng trong lệnh diff
Mục tiêu của lệnh diff rất đơn giản: chỉ ra sự khác biệt. Để làm điều đó một cách hiệu quả, nó sử dụng một số ký hiệu đặc trưng để mô tả chính xác loại thay đổi cần thực hiện giữa hai file. Cá nhân mình thấy rằng thay vì cố gắng đọc toàn bộ file, việc tập trung vào các ký hiệu này giúp tiết kiệm rất nhiều thời gian. Bạn sẽ biết ngay dòng nào được thêm, xóa hay sửa để hai tệp đồng nhất. Bảng dưới đây sẽ tóm tắt nhóm ký hiệu thường gặp trong diff.”
| Ký hiệu | Ý nghĩa |
| a / + | Thêm nội dung |
| c / ! | Thay đổi nội dung |
| d / – | Xóa nội dung |
| < | Dòng thuộc file thứ nhất |
| > | Dòng thuộc file thứ hai |
Hướng dẫn thao tác với lệnh diff kèm ví dụ thực tế
- Ví dụ 1: Dùng diff mặc định để so sánh 2 file file1.txt và file2.txt
- Ví dụ 2: Dùng diff để so sánh 2 file với option -u (unified)
- Ví dụ 3: Dùng diff để so sánh 2 file với option -c (context)
- Ví dụ 4: So sánh file không phân biệt chữ hoa chữ thường
- Ví dụ 5: Bỏ qua khoảng trắng khi so sánh nội dung
- Ví dụ 6: Bỏ qua các dòng trống khi phân biệt file
- Ví dụ 7: So sánh hai thư mục bằng lệnh diff trong Linux
- Ví dụ 8: Kiểm tra nhanh hai file có giống nhau hay không
- Ví dụ 9: So sánh hai file văn bản từ stdin (không cần tạo file trước)
- Ví dụ 10: Chuyển hướng output của diff ra file (làm file patch)
- Ví dụ 11: Hiển thị khác biệt dạng “side-by-side” cho dễ quan sát
Ví dụ 1: Dùng diff mặc định để so sánh 2 file file1.txt và file2.txt
Khi cần kiểm tra nhanh sự khác nhau giữa hai file văn bản theo định dạng tiêu chuẩn, có thể sử dụng lệnh diff ở chế độ mặc định để xem chi tiết những dòng nào cần thêm, xóa hoặc thay đổi.
diff file1.txt file2.txt
Kết quả trả về thường xuất hiện các dòng như 1c1 hoặc 3,4c3,4, trong đó 1c1 nghĩa là dòng 1 của file1 cần được chỉnh lại để khớp với dòng 1 của file2, còn 3,4c3,4 cho biết đoạn từ dòng 3 đến 4 của file1 phải cập nhật thành đoạn từ dòng 3 đến 4 của file2.
Các dòng bắt đầu bằng < là nội dung chỉ có trong file1, các dòng bắt đầu bằng > là nội dung chỉ có trong file2, dấu --- dùng để phân tách hai khối nội dung, còn những dòng không có ký hiệu là phần giống nhau giữa hai file và không cần chỉnh sửa.
Ví dụ 2: Dùng diff để so sánh 2 file với option -u (unified)
Khi cần xem sự thay đổi trong một khối ngữ cảnh thống nhất, đặc biệt phục vụ review code hoặc tạo patch, có thể dùng định dạng unified với tùy chọn -u để gom các thay đổi kèm vài dòng ngữ cảnh xung quanh.
diff -u file1.txt file2.txt
Trong output, hai dòng đầu tiên --- file1.txt … và +++ file2.txt … cho biết tên và thông tin thời gian của file gốc (file cũ) và file mới dùng để so sánh. Dòng hunk @@ -1,4 +1,4 @@ chỉ ra phạm vi dòng bị ảnh hưởng ở mỗi file, ví dụ -1,4 nghĩa là khối thay đổi trong file1 bắt đầu từ dòng 1 với 4 dòng, còn +1,4 là phạm vi tương ứng trong file2.
Các dòng bắt đầu bằng dấu - là nội dung chỉ tồn tại trong file1, các dòng bắt đầu bằng + là nội dung chỉ có trong file2, còn những dòng không có tiền tố là phần không thay đổi, giúp dễ nhận diện chính xác đoạn nào phải thêm, sửa hoặc xóa khi đồng bộ hai phiên bản file.
Ví dụ 3: Dùng diff để so sánh 2 file với option -c (context)
Nếu muốn xem sự khác biệt nhưng vẫn giữ nhiều dòng ngữ cảnh xung quanh mỗi khối thay đổi, lựa chọn định dạng context với tùy chọn -c là phù hợp để quan sát thay đổi trong một đoạn nội dung rộng hơn.
diff -c file1.txt file2.txt
Phần đầu output sẽ chứa dòng *** file1.txt … biểu thị file cũ và dòng --- file2.txt … biểu thị file mới, tiếp theo là các khối được đánh dấu bằng dãy **** cho biết bắt đầu một hunk thay đổi. Bên trong mỗihối, dòng *** 1,4 ** thể hiện phạm vi dòng trong file1 (từ dòng 1 đến dòng 4), còn --- 1,4 ---- là phạm vi tương ứng trong file2; các dòng bắt đầu bằng ! là nội dung khác nhau giữa hai file, trong khi dòng không có ký hiệu là phần giữ nguyên, nhờ vậy người đọc có thể đối chiếu nhanh đoạn cũ và đoạn mới trong cùng một khung ngữ cảnh.
Ví dụ 4: So sánh file không phân biệt chữ hoa chữ thường
Khi hai file chỉ khác nhau ở cách viết hoa/chữ thường và bạn chỉ quan tâm nội dung, có thể dùng tùy chọn -i để bỏ qua khác biệt về case.
diff -i file1.txt file2.txtLệnh này giúp các khác biệt chỉ do “Hello” và “hello” hoặc “CONFIG” và “config” không bị tính là thay đổi, phù hợp khi chuẩn hóa kiểu chữ nhưng giữ nguyên nội dung logic.
Ví dụ 5: Bỏ qua khoảng trắng khi so sánh nội dung
Với các file được format lại (thêm/bớt space, tab) nhưng nội dung chữ không đổi, có thể dùng -w hoặc --ignore-all-space để bỏ qua khoảng trắng trong quá trình so sánh.
diff -w file1.txt file2.txtNhờ bỏ qua khác biệt về space/tab, kết quả diff chỉ tập trung vào thay đổi thực sự trong nội dung, tránh liệt kê các chênh lệch chỉ do căn lề hoặc format lại code.
Ví dụ 6: Bỏ qua các dòng trống khi phân biệt file
Nếu file có nhiều dòng trống được thêm vào hoặc xóa bớt nhưng bạn không muốn xem đó là thay đổi, có thể dùng tùy chọn -B hoặc --ignore-blank-lines.
diff -B file1.txt file2.txtTrong chế độ này, diff sẽ không coi sự xuất hiện hay biến mất của dòng trống là chênh lệch, giúp output gọn hơn khi so sánh tài liệu hoặc mã nguồn có nhiều khoảng trắng dòng.
Ví dụ 7: So sánh hai thư mục bằng lệnh diff trong Linux
Để so sánh toàn bộ cấu trúc và nội dung giữa hai thư mục (bao gồm các thư mục con), bạn có thể sử dụng diff với tùy chọn -r.
diff -r dir1 dir2Lệnh này duyệt đệ quy vào các thư mục con và báo những file bị thiếu, file khác nhau hoặc file chỉ xuất hiện ở một bên, rất hữu ích khi đối chiếu hai bản release hoặc hai bản backup.
Ví dụ 8: Kiểm tra nhanh hai file có giống nhau hay không
Khi chỉ cần biết hai file có hoàn toàn giống nhau hay không mà không cần xem chi tiết nội dung khác biệt, bạn có thể kết hợp -q và -s.
diff -q file1.txt file2.txtChế độ này chỉ hiển thị thông báo “Files … differ” nếu hai file khác nhau, hoặc có thể dùng thêm -s để hiển thị rõ “Files … are identical” khi chúng trùng khớp, giúp kiểm tra nhanh trong script hoặc bước verify.
Ví dụ 9: So sánh hai file văn bản từ stdin (không cần tạo file trước)
Khi chỉ cần so sánh nhanh nội dung mà không muốn lưu ra file, có thể dùng lệnh khác (như cat, printf) pipe vào diff hoặc dùng process substitution.
diff <(echo "Hello") <(echo "Hello Linux")Cách này cho phép so sánh trực tiếp hai chuỗi hoặc output lệnh ngay trên terminal, phù hợp cho thao tác thử nghiệm nhanh mà không phải tạo file tạm.
Ví dụ 10: Chuyển hướng output của diff ra file (làm file patch)
Khi bạn muốn lưu lại kết quả so sánh để áp dụng ở hệ thống khác hoặc dùng với lệnh patch, có thể chuyển hướng output của diff sang một file patch.
diff -u file1.txt file2.txt > change.patchFile change.patch này có thể dùng cùng lệnh patch để cập nhật file cũ thành file mới trên một máy khác hoặc trong quy trình triển khai, giúp quản lý thay đổi có kiểm soát.
Ví dụ 11: Hiển thị khác biệt dạng “side-by-side” cho dễ quan sát
Trong một số trường hợp, việc xem hai phiên bản file nằm cạnh nhau sẽ trực quan hơn, có thể dùng thêm tùy chọn hiển thị song song (tùy hệ thống, thường là --side-by-side hoặc -y).
diff -y file1.txt file2.txtKết quả sẽ đặt nội dung của file1 và file2 trên hai cột cạnh nhau, các khác biệt được đánh dấu ở giữa, giúp dễ dò từng dòng và đối chiếu trực tiếp khi nội dung không quá dài.
Lưu ý khi sử dụng lệnh diff trong Linux
Khi sử dụng lệnh diff trong Linux để so sánh file và thư mục, bạn cần lưu ý một số điểm sau để tránh hiểu nhầm kết quả:
- Diff mặc định phân biệt chữ hoa/chữ thường: Nếu không dùng thêm tùy chọn,
diffcoi “Config” và “config” là hai giá trị khác nhau. Khi chỉ quan tâm nội dung bất kể cách viết, bạn nên dùng-iđể bỏ qua khác biệt về case khi so sánh. - Khoảng trắng và dòng trống có thể tạo ra khác biệt “ảo”: Các thay đổi chỉ liên quan đến space, tab hoặc dòng trống (thêm/bớt khoảng cách dòng) vẫn được diff ghi nhận là khác nhau, vì vậy trong các trường hợp chỉ cần so nội dung chính, nên cân nhắc dùng
-w,-bhoặc-B/--ignore-blank-linesđể bỏ qua các thay đổi do khoảng trắng. - Chọn đúng định dạng output theo mục đích sử dụng: Định dạng normal (mặc định) phù hợp khi cần đọc từng khối thay đổi chi tiết, trong khi
-utiện cho tạo patch/git và-chữu ích khi cần xem nhiều dòng ngữ cảnh, nên cần xác định trước nhu cầu để chọn flag hiển thị cho phù hợp. - So sánh thư mục cần đi kèm tùy chọn đệ quy: Khi đối chiếu hai thư mục, cần dùng
-rđểdiffduyệt vào các thư mục con. Ngoài ra có thể kết hợp thêm--excludeđể bỏ qua một số file hoặc thư mục không cần so sánh (log, backup, node_modules,…). - Kết quả diff có thể dùng để tạo và áp dụng patch: Khi dùng định dạng unified với
-uvà chuyển hướng output sang file, nội dung này có thể được sử dụng bởi lệnhpatchđể tái áp dụng các thay đổi trên môi trường khác, vì vậy cần lưu và quản lý file patch cẩn thận trong quy trình triển khai.

Đối với môi trường làm việc đã tích hợp Git, bạn nên ưu tiên sử dụng lệnh `thay vì lệnh diff tiêu chuẩn. Lệnh git diff cung cấp khả năng phân tích cú pháp tốt hơn, tự động làm nổi bật các thay đổi bằng màu sắc trực quan và hỗ trợ so sánh linh hoạt giữa các vùng lưu trữ tạm thời (staging area), các nhánh (branches) hoặc các phiên bản commit khác nhau trong dự án.
Câu hỏi thường gặp
Nên dùng lệnh diff, cmp hay comm trong trường hợp nào?
– Diff dùng khi cần biết cụ thể dòng nào thay đổi và cách chỉnh sửa để hai file giống nhau.
– cmp phù hợp khi chỉ cần kiểm tra hai file có giống hệt nhau không ở mức byte, không cần xem chi tiết khác biệt.
– comm dùng để so sánh hai file đã được sort, cho output theo 3 cột: dòng chỉ có ở file1, chỉ có ở file2 và dòng chung.
Lệnh diff xử lý file lớn như thế nào, có bị chậm không?
Với các file dung lượng lớn và có nhiều đoạn thay đổi rải rác, diff vẫn cho kết quả chính xác nhưng thời gian chạy có thể tăng; trong GNU diff có tùy chọn --speed-large-files để tối ưu hiệu năng cho trường hợp file lớn, đổi lại có thể tạo ra tập thay đổi dài hơn một chút.
Có thể dùng diff để so sánh file nhị phân không?
Diff chủ yếu được thiết kế cho file văn bản, khi dùng với file nhị phân, nhiều bản cài đặt sẽ chỉ báo “Files … differ” hoặc hiển thị dạng tóm tắt thay vì liệt kê chi tiết từng dòng, nên nếu cần so sánh chính xác byte-level, nên dùng cmp hoặc công cụ chuyên cho binary.
Tóm lại, lệnh diff trong Linux là một trong những công cụ nền tảng giúp so sánh và theo dõi thay đổi giữa các phiên bản file hoặc thư mục, đặc biệt hữu ích trong quy trình phát triển phần mềm, quản lý cấu hình hệ thống và kiểm tra sự khác nhau trước khi triển khai. Khi nắm vững cú pháp, ý nghĩa các tùy chọn cùng cách đọc ký hiệu trong output và biết kết hợp diff với patch hoặc các lệnh khác, bạn có thể kiểm soát thay đổi trên Linux một cách chính xác, dễ truy vết và phù hợp cho cả môi trường làm việc cá nhân lẫn hệ thống sản xuất.




