كيفية المقارنة بين اثنين من كتل القطران المحتوى

StackOverflow https://stackoverflow.com/questions/1030545

سؤال

أريد أن أقول ما إذا كان اثنين من كتل القطران ملفات تحتوي على الملفات متطابقة من حيث اسم الملف و محتوى الملف, لا بما في ذلك البيانات الوصفية مثل تاريخ المستخدم أو المجموعة.

ومع ذلك ، هناك بعض القيود:أولا لا تحكم ما إذا كانت البيانات الوصفية المضمنة عندما جعل الملف tar, في الواقع, ملف القطران دائما يحتوي على بيانات التعريف ، لذلك مباشرة مهرجان دبي السينمائي الدولي وهما القطران الملفات لا تعمل.الثانية ، حيث أن بعض القطران ملفات كبيرة بحيث لا أستطيع تحمل أما الآن ، فإن لهم في دليل temp و الفرق الواردة الملفات واحدا تلو الآخر.(أنا أعرف ما اذا كان يمكنني أما الآن ، فإن file1.القطران في file1/ أنا يمكن مقارنتها من خلال التذرع 'tar -dvf file2.القطران' في الملف/.ولكن عادة ما لا أستطيع تحمله أما الآن ، فإن حتى واحد منهم)

أي فكرة كيف يمكن أن نقارن بين الاثنين القطران الملفات ؟ سيكون من الأفضل إذا كان يمكن إنجازه خلال البرامج النصية قذيفة.بدلا من ذلك, هل هناك أي طريقة للحصول على كل شبه الملف الاختباري دون الواقع أما الآن ، فإن كتل القطران?

شكرا

هل كانت مفيدة؟

المحلول

tarsum هو تقريبا ما تحتاجه.تأخذ انتاجها ، وتشغيله عن طريق نوع للحصول على طلب متطابقة في كل, ثم قارن بين اثنين مع مهرجان دبي السينمائي الدولي.التي ينبغي أن تحصل الأساسية التنفيذ ، سيكون بسهولة بما فيه الكفاية لسحب تلك الخطوات في البرنامج الرئيسي عن طريق تعديل كود بايثون على القيام بهذه المهمة كاملة.

نصائح أخرى

هل أنت المسيطر إنشاء هذه القطران الملفات ؟
إذا كان الأمر كذلك ، أفضل خدعة إنشاء MD5 المجموع الاختباري وتخزينها في ملف داخل الأرشيف نفسها.ثم عندما تريد مقارنة ملفين, أنت فقط استخراج هذه الملفات الاختباري ومقارنتها.


إذا كنت تستطيع أن استخراج واحدة فقط الملف tar, يمكنك استخدام --diff خيار tar إلى البحث عن الاختلافات مع محتويات أخرى الملف tar.


واحد مزيد من النفط الخام خدعة إذا كنت على ما يرام مع مقارنة بين أسماء الملفات وأحجامها.
تذكر أن هذا لا يضمن أن الملفات الأخرى هي نفسها!

تنفيذ tar tvf قائمة محتويات كل ملف تخزين المخرجات في مختلف الملفات.ثم شريحة كل شيء إلى جانب اسم الملف و حجم الأعمدة.ويفضل أن يكون من النوع اثنين من الملفات أيضا.ثم لا مجرد ملف فرق بين القائمتين.

فقط تذكر أن هذا الأخير لم يكن مخطط حقا الاختباري.

عينة القطران الناتج (جميع الملفات حجم صفر في هذا المثال).

$ tar tvfj pack1.tar.bz2
drwxr-xr-x user/group 0 2009-06-23 10:29:51 dir1/
-rw-r--r-- user/group 0 2009-06-23 10:29:50 dir1/file1
-rw-r--r-- user/group 0 2009-06-23 10:29:51 dir1/file2
drwxr-xr-x user/group 0 2009-06-23 10:29:59 dir2/
-rw-r--r-- user/group 0 2009-06-23 10:29:57 dir2/file1
-rw-r--r-- user/group 0 2009-06-23 10:29:59 dir2/file3
drwxr-xr-x user/group 0 2009-06-23 10:29:45 dir3/

الأمر لتوليد فرز الاسم/size

$ tar tvfj pack1.tar.bz2 | awk '{printf "%10s %s\n",$3,$6}' | sort -k 2
0 dir1/
0 dir1/file1
0 dir1/file2
0 dir2/
0 dir2/file1
0 dir2/file3
0 dir3/

يمكنك أن تأخذ اثنين من هذه فرز قوائم مهرجان دبي السينمائي الدولي لهم.
يمكنك أيضا استخدام التاريخ والوقت الأعمدة إذا كان الذي يعمل لديك.

وحاول أيضا pkgdiff الاختلافات بين حزم (بالكشف بإضافة / إزالة / إعادة تسمية الملفات وتغيير محتوى لتصور، الوجود مع رمز الصفر إذا لم يتغير):

pkgdiff PKG-0.tgz PKG-1.tgz

وهنا هو بلدي البديل، هو التحقق من إذن يونكس أيضا:

ويعمل فقط إذا كانت أسماء هي أقصر من 200 حرف.

diff <(tar -tvf 1.tar | awk '{printf "%10s %200s %10s\n",$3,$6,$1}'|sort -k2) <(tar -tvf 2.tar|awk '{printf "%10s %200s %10s\n",$3,$6,$1}'|sort -k2)

وأنا أدرك أن هذا هو وقت متأخر من الرد، ولكن جئت عبر الخيط في حين تحاول تحقيق نفس الشيء. الحل الذي كنت قد نفذت إخراج القطران إلى المعياري، وأنابيب لأيهما التجزئة اخترت:

tar -xOzf archive.tar.gz | sort | sha1sum

لاحظ أن ترتيب الحجج مهم. ولا سيما O مما يشير إلى استخدام المعياري.

tardiff ما كنت تبحث عنه؟ انها "لبيرل سيناريو بسيط" أن "يقارن محتويات اثنين من كتل القطران وتقارير عن أي اختلافات وجدت بينهما".

إذا لم استخراج المحفوظات ولا تحتاج إلى الاختلافات ، في محاولة مهرجان دبي السينمائي الدولي's -q الخيار:

diff -q 1.tar 2.tar

هذا هادئة ستكون النتيجة "1.القطران 2.القطران تختلف" أو لا شيء إذا لم الخلافات.

وهناك أداة تسمى archdiff . انها اساسا المخطوطة التي يمكن أن ننظر إلى المحفوظات.

Takes two archives, or an archive and a directory and shows a summary of the
differences between them.

ولدي سؤال مماثل وأنا حلها من قبل الثعبان، وهنا هو رمز. ملاحظة: على الرغم من أن يستخدم هذا الرمز لمقارنة محتوى اثنين zipball، ولكن انها مماثلة مع كتل القطران، آمل أن أتمكن من مساعدتك

import zipfile
import os,md5
import hashlib
import shutil

def decompressZip(zipName, dirName):
    try:
        zipFile = zipfile.ZipFile(zipName, "r")
        fileNames = zipFile.namelist()
        for file in fileNames:
            zipFile.extract(file, dirName)
        zipFile.close()
        return fileNames
    except Exception,e:
        raise Exception,e

def md5sum(filename):
    f = open(filename,"rb")
    md5obj = hashlib.md5()
    md5obj.update(f.read())
    hash = md5obj.hexdigest()
    f.close()
    return str(hash).upper()

if __name__ == "__main__":
    oldFileList = decompressZip("./old.zip", "./oldDir")
    newFileList = decompressZip("./new.zip", "./newDir")

    oldDict = dict()
    newDict = dict()

    for oldFile in oldFileList:
        tmpOldFile = "./oldDir/" + oldFile
        if not os.path.isdir(tmpOldFile):
            oldFileMD5 = md5sum(tmpOldFile)
            oldDict[oldFile] = oldFileMD5

    for newFile in newFileList:
        tmpNewFile = "./newDir/" + newFile
        if not os.path.isdir(tmpNewFile):
            newFileMD5 = md5sum(tmpNewFile)
            newDict[newFile] = newFileMD5

    additionList = list()
    modifyList = list()

    for key in newDict:
        if not oldDict.has_key(key):
            additionList.append(key)
        else:
            newMD5 = newDict[key]
            oldMD5 = oldDict[key]
            if not newMD5 == oldMD5:
            modifyList.append(key)

    print "new file lis:%s" % additionList
    print "modified file list:%s" % modifyList

    shutil.rmtree("./oldDir")
    shutil.rmtree("./newDir")

وهناك أيضا diffoscope ، وهو أكثر عمومية، ويسمح للمقارنة بين الأشياء بشكل متكرر (بما في ذلك أشكال مختلفة).

pip install diffoscope

ويمكن للمرء أن استخدام برنامج نصي بسيط:

#!/usr/bin/env bash
set -eu

tar1=$1
tar2=$2
shift 2
tar_opts=("$@")

tmp1=`mktemp -d`
_trap="rm -r "$tmp1"; ${_trap:-}" && trap "$_trap" EXIT
tar xf "$tar1" -C "$tmp1"

tmp2=`mktemp -d`
_trap="rm -r "$tmp2"; ${_trap:-}" && trap "$_trap" EXIT
tar xf "$tar2" -C "$tmp2"

diff -ur "${tar_opts[@]:+${tar_opts[@]}}" "$tmp1" "$tmp2"

والاستعمال:

diff-tars.sh TAR1 TAR2 [DIFF_OPTS]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top