Về cơ bản, bạn cần so sánh hai tệp, bỏ qua điều kiện byte theo dõi. Không có tùy chọn 'diff' để làm điều này - nhưng có một số cách có thể được thực hiện (ví dụ, hex diff cũng xuất hiện trong đầu.)
Để sử dụng 'diff', về cơ bản, bạn phải sửa đổi các tệp bị thiếu dòng mới ở cuối tệp và sau đó so sánh. Bạn có thể tạo một thư mục tạm thời với các tệp đã sửa đổi hoặc với một chút kịch bản có thể được thực hiện trong bộ nhớ. (Việc được ưu tiên tùy thuộc vào sở thích, kích thước tệp, số lượng tệp ...)
Ví dụ: phần sau đây sẽ sửa đổi nội dung của tệp (sử dụng sed -i
để sửa đổi tại chỗ, phần này chỉ in ra thiết bị xuất chuẩn) để thêm dòng mới nếu thiếu (hoặc giữ nguyên tệp nếu đã có dòng mới):
sed -e '$a\' file1.txt
Và chỉ để xem lại cú pháp 'diff' (trả về true có nghĩa là chúng giống nhau, false có nghĩa khác nhau):
$ diff a/file1.txt b/file1.txt \
&& echo '** are same' || echo '** are different'
2c2
< eof
---
> eof
\ No newline at end of file
** are different
Xác minh rằng chỉ có khoảng trắng là khác nhau:
$ diff --ignore-all-space a/file1.txt b/file1.txt \
&& echo '** are same' || echo '** are different'
** are same
Trong bash, chúng ta có thể sử dụng 'sed' để thao tác nội dung tệp khi nó được chuyển đến 'diff' (các tệp gốc không thay đổi):
$ diff <(sed -e '$a\' a/file1.txt) <(sed -e '$a\' b/file1.txt) \
&& echo '** are same' || echo '** are different'
** are same
Bây giờ tất cả bạn phải làm là mô phỏng diff -r
để so sánh đệ quy các thư mục. Nếu so sánh các thư mục a
và b
, sau đó cho tất cả các tệp trong a
(ví dụ a/dir1/dir2/file.txt
:) dẫn xuất đường dẫn đến tệp trong b
(ví dụ b/dir1/dir2/file.txt
:) và so sánh:
$ for f in $( find a -type f )
> do
> diff <(sed -e '$a\' $f) <(sed -e '$a\' b/${f#*/})
> done
Một phiên bản dài hơn một chút:
$ for f in $( find a -type f )
> do
> f1=$f
> f2=b/${f#*/}
> echo "compare: $f1 $f2"
> diff <(sed -e '$a\' $f1) <(sed -e '$a\' $f2) \
> && echo '** are same' || echo '** are different'
> done && echo '** all are same' || echo '** all are different'
compare: a/file1.txt b/file1.txt
** are same
compare: a/file2.txt b/file2.txt
** are same
** all are same
sed -e '$a\'
chính xác những gì làm? thx