4 Làm quen với hệ thống tập tin ext3fs
4.6.10 So sánh các tập tin và lệnh patch
Có thể bạn không để ý nhưng khi làm việc với máy tính công việc so sánh nội dung của hai tập tin khác nhau gặp một cách thường xuyên. Là vì có thể sao chép tập tin một cách dễ dàng, rồi sau đó quên luôn là tập tin nào mới hơn hoặc tốt hơn. Vì thế những công cụ dùng để so sánh tập tin là cần thiết và tất nhiên là có trong Linux. Công cụ đơn giản nhất trong số này là lệnh cmp (compare). Lệnh này chỉ so sánh nội dung của hai tập tin theo từng byte:
[user]$ cmp tập_tin1 tập_tin2
Nếu hai tập tin hoàn toàn trùng nhau, thì lệnh hoàn thành công việc mà không đưa ra thông báo gì, còn nếu chúng khác nhau thì đưa ra số thứ tự của dòng và byte ở chỗ có sự khác nhau.
Tất nhiên thông tin mà lệnh cmpđưa ra hơi ít để có thể quyết định chọn tập tin nào trong số hai tập tin này, tập tin nào quan trọng hơn. Vì thế còn có thể sử dụng câu lệnhdiff để biết được sự khác nhau giữa hai tập tin ở đây là gì. Chỉ cần cho câu lệnh này biết tên hai tập tin mà bạn muốn so sánh. Ví dụ:
teppi82@ThinhQuyen:~> diff ChangeLog ChangeLog2 1c1
< 11 tháng 09 năm 2006, phiên bản 0.9.3 ---
> 18 tháng 09 năm 2006, phiên bản 0.9.3
Thông báo về sự khác nhau sẽ hiển thị trên màn hình (đầu ra tiêu chuẩn). Chúng ta có thể chuyển hướng báo cáo này vào một tập tin:
teppi@ThinhQuyen:~> diff ChangeLog ChangeLog2 > ChangeLog.diff teppi@ThinhQuyen:~> more ChangeLog.diff
1c1
< 11 tháng 09 năm 2006, phiên bản 0.9.3 ---
> 18 tháng 09 năm 2006, phiên bản 0.9.3
Để đánh giá phiên bản của một tập tin thì thuận tiện hơn nếu sử dụng câu lệnhsdiff. Kết quả so sánh khi này sẽ hiển thị ở dạng hai cột, phân cách nhau bởi các khoảng trắng. Nếu hai cột có cùng số thứ tự khác nhau, thì chúng sẽ cách nhau bởi một dấu gạch thẳng đứng “|”. Nếu một dòng nào đó chỉ có trong tập tin thứ nhất thì nó được đánh dấu bằng một ký tự “<”, nếu không có trong tập tin thứ hai – một ký tự “>”.
Còn có câu lệnhdiff3 cho phép so sánh 3 tập tin một lúc. Nhưng thường sử dụng nhất trên các hệ thống UNIX và Linux vẫn là câu lệnh diff. Có thể dễ dàng hiểu điều này nếu biết rằng kết quả báo cáo củadiffvề sự khác nhau giữa hai tập tin có thể sử dụng cho câu lệnhpatch. Thông thường khả năng này được dùng khi phân phối bản cập nhật của chương trình ứng dụng. Lấy ví dụ đơn giản (“một cách ngu ngốc”), một chương trình ứng dụng nào đó được đưa cho người dùng ở dạng tập tin xvnkb-0.2.8.c, có chứa mã nguồn của chương trình này trên ngôn ngữ C. Sau đó nhà phát triển sửa các lỗi và cập nhật chương trình rồi lưu mã nguồn trong một tập tin khác xvnkb-0.2.9.c. Bây giờ cần đưa những thay đổi đã làm đến cho người dùng. Tất nhiên là chỉ cần gửi cho người dùng những thay đổi, tức là kết quả báo cáo tạo ra bằng lệnh:
[chuoi]$ diff xvnkb-0.2.8.c xvnkb-0.2.9.c > xvnkb.c.diff
Như vậy tất nhiên là kích thước của tập tinxvnkb.diffsẽ nhỏ hơn nhiều so vớixvnkb-0.2.9.c, sẽ tiết kiệm được dung lượng truyền tải qua mạng Internet nếu chỉ gửi xvnkb.c.diff. Trong trường hợp chương trình ứng dụng lớn thì sự tiết kiệm này là đánh kể. Tuy nhiên tiết kiệm cho người dùng không phải là ứng dụng chính. Mà sự phát triển của ứng dụng mã mở mới là điểm chính. Chúng ta nhớ rằng một ứng dụng mã mở được phát triển bởi cả một nhóm các nhà phát triển và cộng đồng. Mỗi nhà phát triển sẽ đóng góp đoạn mã của mình bằng chính cách này.
Tuy nhiên sau khi nhận được tập tin *.diff thì cần phải đưa những sửa đổi đã làm vào phiên bản hiện thời. Bài toán này là do patch giải quyết. Đã có
xvnkb-0.2.8.cvàxvnkb.c.diff, chỉ cần chạy lệnh:
[user]$ patch xvnkb-0.2.8.c xvnkb.c.diff > xvnkb-0.2.9.c
sẽ thu được tập tinxvnkb-0.2.9.c.