जवाबों:
मान लें कि आपके पास file1
चर का आकार है FILE1_SZ
और आपका head
कार्यान्वयन (गैर-मानक) -c
विकल्प का समर्थन करता है :
if head -c "$FILE1_SZ" file2 | cmp -s - file1; then
echo "file1 is a prefix of file2"
else
echo "file1 is not a prefix of file2"
fi
cmp
तुलना करने के लिए एक साधारण बाइट करता है, और जैसे ही यह एक अंतर पाता है, वैसे ही लौटता है, जबकि diff
एक पाठ उपयोगिता है जो आपको दो फ़ाइलों के बीच सभी अंतरों को दिखाने के लिए एक जटिल एल्गोरिथ्म का उपयोग करने जा रही है जिसकी आपको परवाह नहीं है।
यदि आपके सिस्टम में cmp
GNU से कमांड है diffutils
, तो एक विकल्प है
cmp -n 124665 file1 file2
दो फाइलों के सबसे पहले 124665 बाइट्स की तुलना करें और रिपोर्ट करें कि क्या वे भिन्न हैं - या, आमतौर पर
cmp -n "$(wc -c < file1)" file1 file2
$(stat -c %s file1)
बाइट्स में आकार के लिए सुझाव देना बेहतर होगा ? क्या wc
वास्तव में बाइट काउंट प्राप्त करने के लिए पूरी फाइल को खोलना और प्रोसेस करना है?
wc
कार्यान्वयन उस मामले को अनुकूलित करेंगे और एक fstat()
(या / और एक lseek(SEEK_END)
) करेंगे, इसलिए यह उतना ही कुशल होगा जितना इसे मिलता है। दूसरी ओर, वह stat -c
जीएनयू विशिष्ट है।
cmp
, तो आप यथोचित रूप से जीएनयू-विशिष्ट मान सकते हैं stat
।
GNU cmp
समस्या को आसान तरीके से हल कर सकता है:
cmp file1 file2
चार संभावित आउटपुट (किसी प्रकार की त्रुटि को छोड़कर) हैं।
कोई आउटपुट नहीं: फ़ाइलें समान हैं।
cmp: EOF on file1
: file1 file2 का एक उपसर्ग है।
cmp: EOF on file2
: file2 file1 का एक उपसर्ग है।
file1 file2 differ: byte NNN, line MMM
: न ही दूसरे का उपसर्ग है।
दुर्भाग्य से यह एक स्क्रिप्ट में उपयोग करने के लिए थोड़ा अजीब है, क्योंकि ये मामले निकास कोड में प्रतिष्ठित नहीं लगते हैं। इसके अलावा, संदेश EOF on file1
stderr पर जाते हैं, जबकि file1 file2 differ
संदेश stdout में जाता है।
मैं मानता हूं कि अन्य संस्करण cmp
भी कुछ ऐसा ही करते हैं, लेकिन मैंने जांच नहीं की है।
cmp
जीएनयू-केवल कमांड नहीं है और न ही यह वहां उत्पन्न हुआ है, यह 70 के दशक के शुरुआती दिनों में यूनिक्स के पहले संस्करण में था। -n
विकल्प जीएनयू विशिष्ट हालांकि है।
cmp file1 file2 2>&1 | grep EOF on file1
cmp
था कि जीएनयू के लिए यह अद्वितीय था, बस जीएनयू cmp
केवल एक ही संस्करण था जो मैंने कोशिश की थी। मैंने स्पष्ट करने के लिए एक वाक्य जोड़ा।
file1
और दूसरे का नाम है file12
। (या बुरा अभी तक, अगर दूसरी फ़ाइल का नाम EOF on file1
क्या है?) इस का उपयोग करते हुए मजबूती से हल करना cmp
सी में स्पष्ट 5-लाइन प्रोग्राम लिखने की तुलना में बहुत अधिक परेशानी है ...
cmp
बहुत कसकर विवश है। पूरी लाइन के मिलान के लिए -x
विकल्प का उपयोग grep
करने से सभी का ध्यान रखना पड़ेगा, लेकिन सबसे अधिक विदेशी मामले (उदाहरण के लिए फ़ाइल नाम में नईं)।
cmp
से बेहतर क्यों होगाdiff
?