বিভিন্ন ফাইলের মধ্যে পার্থক্য, সমস্ত সমান না হলে সত্য


18

আমার কাছে বেশ কয়েকটি ফাইল রয়েছে, আমি যাচাই করতে চাই যে এই সমস্ত ফাইলগুলিতে একই সামগ্রী রয়েছে have

আমি এটি পরীক্ষা করতে কোন কমান্ড লাইন ব্যবহার করতে পারি?

ব্যবহারের মতো কিছু হতে পারে:

$ diffseveral file1 file2 file3 file4

ফলাফল:

All files equals

অথবা

Files are not all equals

উত্তর:


27

জিএনইউ ডিফের সাথে ফাইলগুলির মধ্যে একটিকে যুক্তি হিসাবে --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
@ ড্যারেনডাব্লু অবশ্যই, আপনার যদি এমন অনেকগুলি থাকে তবে কেবল একটি লুপ ব্যবহার করেন।
কেভিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.