मुश्किल कई फाइलें, अगर सभी बराबर नहीं हैं


18

मेरे पास बहुत सी फाइलें हैं, मैं यह जांचना चाहता हूं कि उन सभी फाइलों की सामग्री एक ही है।

जाँच करने के लिए मैं किस कमांड लाइन का उपयोग कर सकता हूँ?

उपयोग कुछ इस तरह हो सकता है:

$ diffseveral file1 file2 file3 file4

परिणाम:

All files equals

या

Files are not all equals

जवाबों:


28

GNU अंतर के साथ, एक तर्क के रूप में --from-fileकिसी भी फाइल को और किसी भी संख्या में ऑपरेंड के रूप में पास करें:

$ diff -q --from-file file1 file2 file3 file4; echo $?
0
$ echo >>file3
$ diff -q --from-file file1 file2 file3 file4; echo $?
Files file1 and file3 differ
1

4

कैसा रहेगा:

md5sum * | awk 'BEGIN{rc=1}NR>1&&$1!=last{rc=0}{last=$1}END{exit rc}'

प्रत्येक फ़ाइल के लिए MD5 मान की गणना करता है, फिर अगले के साथ प्रत्येक प्रविष्टि की तुलना करता है, यदि कोई अलग है, तो एक शून्य (सही) निकास स्थिति लौटाएं। यदि यह गलत है तो यह बहुत कम होगा यदि यह अलग है:

md5sum * | awk 'NR>1&&$1!=last{exit 1}{last=$1}'

छँटनी की कोई जरूरत नहीं है क्योंकि हम जाँच रहे हैं कि क्या कोई अलग है।


1
छोटे संस्करण में, मुझे लगता है कि $ 1 का उपयोग किया जाना चाहिए, क्योंकि $ 0 में फ़ाइल नाम शामिल है जो अद्वितीय है।
xanpeng

2

निम्नलिखित कोड काफी आत्म व्याख्यात्मक होना चाहिए। $#फ़ाइल तर्कों की संख्या है, और shiftबस उन्हें एक बार में खपत करता है। cmp -sमूक बाइट-वार तुलना के लिए उपयोग करता है ।

#!/bin/sh
# diffseveral

if [ $# -lt 2 ]; then
    printf '%s\n' "Usage: $0 file1 file2 [files ...]" >&2
    exit 2
fi

oldfile="$1"
shift

while [ $# -gt 0 ]; do
    newfile="$1"
    if ! cmp -s "$oldfile" "$newfile"; then
         echo 'Files differ.'
         exit 1;
    fi

    shift
done

echo 'All files identical.'
exit 0

0

आप diffएक समय में केवल दो कर सकते हैं , लेकिन यह जांचना काफी आसान है कि क्या वे सभी समान हैं:

if diff file1 file2 && diff file2 file3 && diff file3 file4; then
    echo All equal
else
    echo Not
fi

यदि आपके पास एक लूप को सही ठहराने के लिए पर्याप्त है, तो इस तरह से कुछ का उपयोग करें:

alleq () {  
    for file; do 
        diff -q "$1" "$file" >/dev/null || return 1
    done
}

if alleq file1 file2 ...; then
    echo All equal
else 
    echo Not
fi

अनाड़ी अगर आपके पास पचास फाइलें हैं, या न जाने कितने हैं
डैरन डब्ल्यू

1
@DarenW ज़रूर, अगर आपके पास है कि कई बस एक लूप का उपयोग करें।
केविन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.