كيفية المقارنة بين اثنين من كتل القطران المحتوى
-
06-07-2019 - |
سؤال
أريد أن أقول ما إذا كان اثنين من كتل القطران ملفات تحتوي على الملفات متطابقة من حيث اسم الملف و محتوى الملف, لا بما في ذلك البيانات الوصفية مثل تاريخ المستخدم أو المجموعة.
ومع ذلك ، هناك بعض القيود:أولا لا تحكم ما إذا كانت البيانات الوصفية المضمنة عندما جعل الملف 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]