2012-10-15 11 views
135

मेरे पास एक शेल स्क्रिप्ट है जिसमें मुझे यह जांचने की आवश्यकता है कि दो फाइलें समान हैं या नहीं। मैं इसे बहुत सारी फाइलों के लिए करता हूं, और मेरी स्क्रिप्ट में diff कमांड प्रदर्शन बाधा प्रतीत होता है।यूनिक्स/लिनक्स में दो फाइलें समान हैं या नहीं, यह बताने का सबसे तेज़ तरीका है?

diff -q $dst $new > /dev/null 

if ($status) then ... 

फ़ाइलें, डिफ़ॉल्ट diff के बजाय शायद एक कस्टम एल्गोरिथ्म तुलना करने के लिए एक तेज़ तरीका हो सकते हैं:

यहाँ लाइन है?

+6

यह वास्तव में नाइटपिकिंग है, लेकिन आप यह देखने के लिए नहीं कह रहे हैं कि दो फाइलें समान हैं या नहीं, आप पूछ रहे हैं कि दो फाइलों में समान सामग्री है या नहीं। वही फाइलों में समान इनोड्स (और एक ही डिवाइस) होते हैं। – Zano

उत्तर

227

मेरा मानना ​​है कि cmp पहले बाइट अंतर पर बंद हो जाएगा:

cmp --silent $old $new || echo "files are different" 
+0

मैं केवल एक से अधिक आदेश कैसे जोड़ सकता हूं? मैं एक फाइल और रॉबूट कॉपी करना चाहता हूं। –

+0

@DanielBrunner: आप 'tee' कमांड का उपयोग करके मानक इनपुट से फ़ाइल और मानक आउटपुट दोनों में कॉपी कर सकते हैं। –

+0

ध्यान दें कि मेरे 'cmp' पर मुझे इसे गूंजने के लिए शॉर्टकट करने की आवश्यकता नहीं थी, अगर वे अलग-अलग होते हैं या चुप रहते हैं तो वे एक संदेश प्रिंट करेंगे। – eresonance

12

आपको दोनों फाइलों की सामग्री का हैश क्यों नहीं मिलता है?

इस प्रकार इस स्क्रिप्ट की कोशिश करें, यह उदाहरण script.sh के लिए कॉल और फिर इसे चलाएँ: script.sh file1.txt file2.txt

#!/bin/bash 

file1=`md5 $1` 
file2=`md5 $2` 

if [ "$file1" = "$file2" ] 
then 
    echo "Files have the same content" 
else 
    echo "Files have NOT the same content" 
fi 
+0

खेद नहीं है कि आप किस बात का जिक्र कर रहे हैं, मैं यूनिक्स को बहुत लंबा नहीं लिख रहा हूं। – JDS

+0

यदि दो फाइलें समान हैं, तो उनके पास एक ही हैश मान होगा। उदाहरण के लिए यदि 'file1.txt' सामग्री 'aaa' और 'file2.txt' तो, तो जब आप md5 हैश प्राप्त करते हैं: md5 file1.txt आपको मिलेगा: 5c9597f3c8245907ea71a89d9d39d08e जो md5 file2.txt के समान आउटपुट होगा, अगर आप दोनों हैंश का काम करते हैं और वे वही हैं जो आप आश्वस्त कर सकते हैं कि दोनों के पास एक ही सामग्री है :) – jabaldonedo

+0

ओह ठीक तरह से कुछ प्रकार की चेक राशि की तरह है।मैंने इसे एक संभावना के रूप में माना; क्या इसके लिए एक साधारण यूनिक्स कमांड है? – JDS

4

ऐसी फ़ाइलों के लिए जो अलग नहीं हैं, किसी भी विधि को पूरी तरह से दोनों फ़ाइलों को पढ़ने की आवश्यकता होगी, भले ही पढ़ना अतीत में था।

कोई विकल्प नहीं है। तो समय पर किसी भी समय हैश या चेकसम बनाने की पूरी फ़ाइल पढ़ना आवश्यक है। बड़ी फाइलें समय लेती हैं।

फ़ाइल मेटाडाटा पुनर्प्राप्ति एक बड़ी फ़ाइल पढ़ने से बहुत तेज है।

तो, क्या कोई फ़ाइल मेटाडेटा है जिसका उपयोग आप यह सुनिश्चित करने के लिए कर सकते हैं कि फाइलें अलग हैं? फ़ाइल का आकार? या फ़ाइल कमांड के परिणाम भी जो फ़ाइल के एक छोटे हिस्से को पढ़ते हैं?

फ़ाइल का आकार उदाहरण कोड टुकड़ा:

ls -l $1 $2 | 
    awk 'NR==1{a=$5} NR==2{b=$5} 
     END{val=(a==b)?0 :1; exit(val) }' 

[ $? -eq 0 ] && echo 'same' || echo 'different' 

फ़ाइलें एक ही आकार तो आप पूर्ण फ़ाइल पढ़ता के साथ फंस रहे हैं कर रहे हैं।

+1

यदि उपयोगकर्ता या समूह के नामों में व्हाइटस्पेस है तो समस्याओं से बचने के लिए 'ls -n' का उपयोग करें। – tricasse

29

मुझे पसंद है @ एलेक्स हावांस्की ने इसके लिए 'cmp --silent' का उपयोग किया है।

cmp --silent file1 file2 && echo '### SUCCESS: Files Are Identical! ###' || echo '### WARNING: Files Are Different! ###' 

मैं तो एक निरंतर फ़ाइल के खिलाफ फाइलों की जांच करने के टर्मिनल में या एक ssh के साथ इस चला सकते हैं: तो मैं का उपयोग लेकिन मैं सकारात्मक और नकारात्मक दोनों प्रतिक्रिया की जरूरत है।

+11

यदि आपकी 'गूंज सफलता' कमांड (या जो भी अन्य आदेश आप इसके स्थान पर डालते हैं) विफल रहता है, तो आपकी "नकारात्मक प्रतिक्रिया" कमांड चलाया जाएगा। आपको "if-then-else-fi" निर्माण का उपयोग करना चाहिए। उदाहरण के लिए, [यह सरल उदाहरण] (http://stackoverflow.com/a/16034851/5419599) की तरह। – Wildcard

+0

कृपया स्क्रिप्ट –

2

cksum आदेश का उपयोग करने के लिए भी प्रयास करें:

chk1=`cksum <file1> | awk -F" " '{print $1}'` 
chk2=`cksum <file2> | awk -F" " '{print $1}'` 

if [ $chk1 -eq $chk2 ] 
then 
    echo "File is identical" 
else 
    echo "File is not identical" 
fi 

cksum आदेश होगा उत्पादन एक फ़ाइल की बाइट गिनती। 'मैन कक्सम' देखें।

+1

में पिछली '" 'बदलें, यह मेरा पहला विचार भी था। हालांकि, यदि आपको एक ही फाइल की तुलना कई बार की जाती है, तो हैश को समझ में आता है, क्योंकि हैश की गणना केवल एक बार की जाती है। यदि आप इसकी तुलना केवल एक बार कर रहे हैं , फिर 'md5' पूरी फ़ाइल को वैसे भी पढ़ता है, इसलिए' अंतर ', पहले अंतर पर रोकना, तेज़ होगा। –

संबंधित मुद्दे

 संबंधित मुद्दे