2012-10-04 35 views
13

Tôi đã tự hỏi nếu có ai có thể cho tôi biết nếu có một chức năng có sẵn trong unix, bash so sánh tất cả các dòng của các tập tin. Nếu chúng khác nhau, nó sẽ xuất ra true/false, hoặc -1,0,1. Tôi biết các hàm cmp này tồn tại trong các ngôn ngữ khác. Tôi đã nhìn quanh các trang của người đàn ông nhưng đã không thành công. Nếu nó không có sẵn, ai đó có thể giúp tôi đưa ra một giải pháp thay thế?So sánh chức năng so sánh hai tập tin văn bản trong Unix

Cảm ơn

+0

'diff -u file1 file2' Lưu ý: sản lượng khác có thể (và sẽ) được sử dụng bởi 'patch' chương trình để" chỉnh sửa "file1 vào file2 (hoặc ngược lại) – wildplasser

Trả lời

1

Bạn có thể sử dụng diff, mà kết quả đầu ra sự khác biệt giữa hai tập tin và gửi lại 1 nếu họ là khác nhau, 0 nếu họ đều giống nhau.

$> echo toto > file1; echo tota file2; diff file1 file2 
1c1 
< toto 
--- 
> tota 
+0

bạn có thể giải thích điều này tốt hơn một chút không? toto và tota là ...? – Masterminder

+0

chuỗi mà tôi xuất vào một tệp. Sau đó tôi so sánh từng tập tin, file1 chứa toto, file2 chứa tota. – tomahh

+0

và sau đó là hạn ngạch < toto --- >? thx btw – Masterminder

0

Bạn có thể làm một md5 trên hai tập tin, sau đó so sánh các kết quả trong bash.

Không có hộp Unix nào ở đây để kiểm tra, nhưng điều này sẽ đúng.

#!/bin/bash 

md1=$(md5 file1); 
md2=$(md5 file2); 

if [ $md1 -eq $ $md2 ]; then 
    echo The same 
else 
    echo Different 
fi 
3

Có một lệnh cmp file file đơn giản thực hiện điều đó. Nó trả về 0 nếu chúng bằng nhau và 1 nếu họ là khác nhau, do đó, nó tầm thường để sử dụng trong if s:

if cmp file1 file1; then 
    ... 
fi 

Hope this helps =)

+1

chỉ cần đánh tôi với nó. :-) Thêm tùy chọn '-s' sẽ đảm bảo rằng nó là im lặng cho các tệp khác nhau và chỉ cung cấp mã trả về để bạn không nhận được kết quả bổ sung – TaninDirect

31

Có một số cách để làm điều này:

  • cmp -s $file1 $file2: Xem giá trị của $?. Không nếu cả hai tệp đều khớp hoặc khác không.
  • diff $file1 $file2 > /dev/null: Một số hình thức của lệnh diff có thể có thông số cho biết không được xuất ra bất kỳ thứ gì. Tuy nhiên, hầu hết không. Sau khi tất cả, bạn sử dụng diff để xem sự khác biệt giữa hai tệp. Một lần nữa, các mã lối ra (bạn có thể kiểm tra giá trị của $? sẽ là 0 nếu các tập tin phù hợp và khác không khác

Bạn có thể sử dụng các lệnh trong một vỏ lệnh if:.

if cmp -s "$file1" "$file2" 
then 
    echo "The files match" 
else 
    echo "The files are different" 
fi 

lệnh diff được thực hiện cụ thể cho các tập tin văn bản. lệnh cmp nên làm việc với tất cả các tập tin nhị phân quá.

1
#!/bin/bash 

file1=old.txt 
file2=new.txt 

echo " TEST 1 : " 
echo 

if [ $(cmp -s ${file1} ${file2}) ] 
then 
    echo "The files match" 
else 
    echo "The files are different" 
fi 

echo 
echo " TEST 2 : " 
echo 
bool=$(cmp -s "$file1" "$file2") 
if cmp -s "$file1" "$file2" 
then 
    echo "The files match" 
else 
    echo "The files are different" 
fi 

echo 
echo " TEST 3 : " 
echo 

md1=$(md5 ${file1}); 
md2=$(md5 ${file2}); 

mdd1=$(echo $md1 | awk '{print $4}') 
mdd2=$(echo $md2 | awk '{print $4}') 
echo $md1 
echo $mdd1 
echo $md2 
echo $mdd2 
echo 

if [ $mdd1 = $mdd2 ]; 
then 
    echo "The files match" 
else 
    echo "The files are different" 
fi 
0

echo "đọc tập tin đầu tiên" đọc f1 echo "đọc tập tin thứ hai" đọc f2

diff -s f1 f2 # in nếu cả hai tập tin được giống hệt nhau