Lệnh diff là một cách dễ dàng để so sánh các tệp hoặc thư mục từ shell Linux. Bài viết này sẽ chỉ cho bạn cách sử dụng nó, với một số ví dụ về cách dùng phổ biến.
Lệnh diff thực hiện so sánh từng dòng của hai tệp hoặc thư mục và xuất ra các khác biệt giữa chúng.
Tại sao bạn muốn so sánh tệp hoặc thư mục?
- Bạn có thể có hai tệp cùng tên trông giống nhau và muốn xem sự khác biệt giữa chúng.
- So sánh các thay đổi trong mã lập trình của dự án bạn đang xây dựng giữa phiên bản mới và cũ.
- Bạn đã sao chép nhiều tệp sang ổ đĩa khác và muốn đảm bảo mọi thứ được sao chép thành công và không bị hỏng.
- Bạn và một người bạn cùng có một tập tệp trong một thư mục. Bạn đã làm thay đổi tệp của mình, nhưng không muốn gửi lại tất cả cho bạn bè. Bạn có thể dùng diff để tạo một bản vá chỉ chứa các thay đổi, gửi cho họ, sau đó cập nhật bản sao của họ mà không cần tải xuống lại mọi thứ.
Bạn chắc chắn sẽ có lý do riêng để so sánh tệp, vậy hãy chuyển đến diff và cách sử dụng nó.
Cú Pháp diff
diff OPTIONS FILES
Lưu ý rằng:
- OPTIONS là tùy chọn và có thể cung cấp từ bảng dưới đây
- FILES là đường dẫn đến hai tệp cần so sánh, phân tách bằng dấu cách
Các Tùy Chọn Của diff
Dưới đây là các OPTIONS thường dùng nhất cho lệnh diff, lấy trực tiếp từ hướng dẫn sử dụng:
| Tùy chọn | Mô tả |
|---|---|
| -q, –brief | Chỉ báo cáo khi tệp khác nhau |
| -s, –report-identical-files | Báo cáo khi hai tệp giống nhau |
| -u, -U NUM, –unified[=NUM] | Xuất NUM (mặc định 3) dòng ngữ cảnh thống nhất |
| -N –new-file | Coi tệp thiếu như tệp rỗng |
| -l, –paginate | Chuyển đầu ra qua 'pr' để phân trang |
| -r, –recursive | Đệ quy so sánh các thư mục con tìm thấy |
| –no-dereference | Không theo dõi symbolic link |
| -a, –text | Coi tất cả tệp như văn bản |
| -d, –minimal | Cố gắng tìm tập thay đổi nhỏ hơn |
| –speed-large-files | Giả định tệp lớn và nhiều thay đổi nhỏ rải rác |
Bạn có thể xem hướng dẫn đầy đủ tại đây hoặc chạy:
man diff
…từ dòng lệnh để có bộ tùy chọn đầy đủ.
Ví Dụ
So Sánh Tệp Với diff Trong Linux
Đây là cách dùng đơn giản nhất của lệnh diff và sẽ xuất ra sự khác biệt giữa hai tệp được cung cấp ra console:
diff file1.txt file2.txt
Chuyển Hướng Đầu Ra
Nếu bạn chỉ muốn xem các khác biệt thay vì tạo bản vá, việc chuyển hướng đầu ra ra một tệp rất hữu ích – để terminal không cắt bớt bất kỳ thay đổi nào nếu có nhiều thay đổi:
diff -q file1.txt file2.txt > differences.txt
Điều này sẽ tạo (hoặc ghi đè!) differences.txt, tóm tắt các khác biệt giữa hai tệp.
Tùy chọn -q đã được thêm để chỉ liệt kê các khác biệt; các tệp giống nhau sẽ không được nhắc đến để dễ dàng thấy rõ điều gì đang xảy ra.
So Sánh Thư Mục Với diff
Thư mục cũng có thể được so sánh bằng tùy chọn -r (đệ quy) để so sánh nội dung của chúng:
diff -r -q /path/to/dir1 /path/to/dir2
Lại một lần nữa, tôi đã dùng tùy chọn -q ở đây để chỉ liệt kê các khác biệt.
So Sánh Tệp Lớn Hoặc Thư Mục Chứa Tệp Lớn
diff là một quá trình tốn nhiều tài nguyên – mọi tệp được so sánh đều cần được đọc và so sánh. Nó có thể mất một lúc.
Tùy chọn –speed-large-files thay đổi thuật toán của diff để làm cho nó hiệu quả hơn nếu bạn đang so sánh các tệp lớn – làm nhanh quá trình lên một chút.
Tạo Bản Vá Cho Tệp
Để tạo một bản vá – danh sách các khác biệt giữa hai tệp có thể được áp dụng cho bản sao khác của tệp đầu tiên để làm cho nó giống hệt tệp thứ hai, lệnh sau có thể được dùng:
diff -u file1.txt file2.txt > update.patch
Tùy chọn -u xuất các khác biệt ở định dạng thống nhất có thể được dùng bởi lệnh patch để cập nhật tệp gốc với các thay đổi.
Điều này hữu ích nếu bạn có bạn bè hoặc đồng nghiệp đang sử dụng một số dữ liệu hoặc mã lập trình của bạn, và bạn muốn gửi cho họ các cập nhật bạn đã làm mà không cần gửi lại toàn bộ bộ dữ liệu hoặc ứng dụng.
Cài Đặt Bản Vá Cho Tệp
Khi người bạn nhận được bản vá, họ có thể áp dụng nó bằng lệnh patch sau:
patch original.txt < update.patch
Hoàn Tác Bản Vá Cho Tệp
Nếu bạn làm nhầm, bạn có thể hoàn tác bản vá bằng cách chạy nó ngược lại với tùy chọn -R:
patch -R original.txt < update.patch
Tạo Bản Vá Cho Thư Mục
Lệnh sau sẽ tạo bản vá cho toàn bộ thư mục bằng cách chạy các tùy chọn -r (đệ quy), -u (định dạng thống nhất), và -N (coi tệp thiếu như rỗng).
diff -ruN originalDir updatedDir > update.patch
Cài Đặt Bản Vá Cho Thư Mục
Bản vá có thể được áp dụng cho thư mục bằng tùy chọn -p0, sẽ áp dụng bản vá cho cùng cấu trúc thư mục như khi nó được tạo:
patch -p0 < update.patch
Hoàn Tác Bản Vá Cho Thư Mục
Cuối cùng, hoàn tác/đảo ngược việc vá thư mục:
patch -R -p0 originalFile < patchFile