আমি কীভাবে একটি ডিরেক্টরের সামগ্রীর MD5 যোগফলকে এক যোগফল হিসাবে পেতে পারি?


171

Md5sum প্রোগ্রাম ডিরেক্টরিগুলির জন্য চেকসাম সরবরাহ করে না। আমি সাব ডিরেক্টরি ডিরেক্টরি ফাইল সহ একটি ডিরেক্টরি পুরো সামগ্রীর জন্য একটি একক MD5 চেকসাম পেতে চাই। এটি হ'ল, সমস্ত ফাইলগুলির মধ্যে একটি সমন্বিত চেকসাম। এই কাজ করতে একটি উপায় আছে কি?

উত্তর:


186

সঠিক উপায় আপনি কেন জিজ্ঞাসা করছেন তার উপর নির্ভর করে:

বিকল্প 1: কেবলমাত্র ডেটা তুলনা করুন

আপনার যদি কেবল গাছের ফাইলের সামগ্রীগুলির একটি হ্যাশ দরকার হয় তবে এটি কৌশলটি করবে:

$ find -s somedir -type f -exec md5sum {} \; | md5sum

এটি প্রথমে অনুমানযোগ্য ক্রমে সমস্ত ফাইলের সামগ্রীর সংক্ষিপ্তসার করে, তারপরে ফাইলের নাম এবং MD5 হ্যাশগুলিকে নিজেই ধাবিত করতে দেয় যা একটিমাত্র মান দেয় যা কেবলমাত্র যখন গাছের কোনও একটির ফটোগুলি পরিবর্তিত হয় changes

দুর্ভাগ্যক্রমে, find -sশুধুমাত্র ম্যাকোস, ফ্রিবিএসডি, নেটবিএসডি এবং ওপেনবিএসডি ব্যবহৃত BSD সন্ধান (1) এর সাথে কাজ করে। জিএনইউ বা এসইউএস সন্ধান (1) এর সাথে কোনও সিস্টেমে তুলনামূলক কিছু পাওয়ার জন্য আপনার কিছুটা কুরুচিপূর্ণ দরকার:

$ find somedir -type f -exec md5sum {} \; | sort -k 2 | md5sum

আমরা find -sএকটি কল দিয়ে প্রতিস্থাপন করেছি sort-k 2বিট বলা হয়েছে যে সব MD5 হ্যাশ উপর লাফালাফি করা, তাই এটি শুধুমাত্র ফাইলের নাম, যা, শেষ অফ লাইন মাধ্যমে ক্ষেত্র 2 দ্বারা বাছাই করে sortএর হিসাব।

কমান্ডের এই সংস্করণটির সাথে একটি দুর্বলতা রয়েছে, এটি হ'ল যদি আপনার নতুন ফাইলগুলির সাথে নতুন ফাইলগুলির কোনও ফাইল নাম থাকে তবে এটি বিভ্রান্ত হওয়ার জন্য দায়বদ্ধ কারণ এটি sortকলটিতে একাধিক লাইনের মতো দেখাবে । find -sবৈকল্পিক, যে সমস্যা নেই, কারণ গাছ ট্র্যাভেরসাল এবং বাছাই একই প্রোগ্রামের মধ্যে ঘটতে find

উভয় ক্ষেত্রেই, মিথ্যা ধনাত্মকতা এড়াতে বাছাই করা প্রয়োজনীয়: সর্বাধিক সাধারণ ইউনিক্স / লিনাক্স ফাইল সিস্টেমগুলি স্থিতিশীল, অনুমানযোগ্য ক্রমে ডিরেক্টরি তালিকা বজায় রাখে না। আপনি এটি ব্যবহার lsএবং এমনটি থেকে উপলব্ধি করতে পারেন না , যা নিঃশব্দে আপনার জন্য ডিরেক্টরি সামগ্রীর জন্য বাছাই করে। findছাড়া -sবা sortকলে যাই হোক না কেন অর্ডার অন্তর্নিহিত ফাইলসিস্টেম তাদের ফেরৎ ফাইল প্রিন্ট আউট করতে, যা এই কমান্ড একটি পরিবর্তিত হ্যাশ মান দিতে হবে যদি ফাইলের অর্ডার ইনপুট পরিবর্তন যেমন দেওয়া যাচ্ছে।

আপনাকে md5sumকমান্ডগুলি পরিবর্তন করতে হবে md5বা অন্য কোনও হ্যাশ ফাংশনে পরিবর্তন করতে হবে । আপনি যদি অন্য একটি হ্যাশ ফাংশন চয়ন করেন এবং আপনার সিস্টেমের জন্য কমান্ডের দ্বিতীয় ফর্মের প্রয়োজন হয়, আপনাকে sortসেই অনুযায়ী কমান্ডটি সামঞ্জস্য করতে হবে । আর একটি ফাঁদ হ'ল কিছু ডেটা সংমিশ্রণমূলক প্রোগ্রামগুলি কোনও ফাইলের নাম লেখায় না, এটি একটি পুরানো ইউনিক্স sumপ্রোগ্রাম example

এই পদ্ধতিটি কিছুটা অক্ষম, md5sumN + 1 বার কল করে যেখানে N গাছের মধ্যে ফাইলগুলির সংখ্যা, তবে ফাইল এবং ডিরেক্টরি মেটাডেটা হ্যাশিং এড়ানোর জন্য এটি প্রয়োজনীয় খরচ।

বিকল্প 2: ডেটা এবং মেটাডেটার তুলনা করুন

আপনার যদি কেবল কোনও ফাইলের বিষয়বস্তু নয়, গাছের যে কোনও কিছু পরিবর্তিত হয়েছে তা সনাক্ত করতে সক্ষম হতে tarহবে তবে আপনার জন্য ডিরেক্টরি সামগ্রীটি প্যাক করতে বলুন, তারপরে এটি প্রেরণ করুন md5sum:

$ tar -cf - somedir | md5sum

কারণ tarফাইল ফাইলের অনুমতি, মালিকানা ইত্যাদিও দেখায়, এটি কেবল ফাইলের সামগ্রীতে পরিবর্তন নয়, এই জিনিসগুলির পরিবর্তনগুলিও সনাক্ত করবে।

এই পদ্ধতিটি যথেষ্ট দ্রুত, কারণ এটি গাছের উপর দিয়ে কেবল একটি পাস করে এবং হ্যাশ প্রোগ্রামটি একবারে চালায় once

সঙ্গে findভিত্তিক পদ্ধতি উপরে tarঅর্ডার অন্তর্নিহিত ফাইলসিস্টেম তাদের ফেরৎ মধ্যে ফাইলের নাম প্রক্রিয়া করতে যাচ্ছে। আপনার আবেদনে এটি খুব ভাল হতে পারে আপনি নিশ্চিত হতে পারেন যে আপনি এটি ঘটবে না। আমি কমপক্ষে তিনটি পৃথক ব্যবহারের ধরণগুলি ভাবতে পারি যেখানে সম্ভবত এটিই ঘটবে। (আমি তাদের তালিকা বদ্ধ করতে যাচ্ছি না, কারণ আমরা অনির্ধারিত আচরণের অঞ্চলে gettingুকছি Each প্রতিটি ফাইল সিস্টেম এখানে আলাদা আলাদা হতে পারে, এমনকি ওএসের একটি সংস্করণ থেকে পরের সংস্করণেও))

যদি আপনি নিজেকে মিথ্যা ধনাত্মক হয়ে উঠতে দেখেন তবে আমি গিলসের উত্তরেরfind | cpio বিকল্পটি নিয়ে যাওয়ার পরামর্শ দিচ্ছি


7
আমার মনে হয় এটা সবচেয়ে ভাল হয় তুলনা করা হচ্ছে ডিরেক্টরি নেভিগেট এবং ব্যবহার করা find .পরিবর্তে find somedir। অনুসন্ধানের জন্য বিভিন্ন পাথ-স্পেস সরবরাহ করার সময় এইভাবে ফাইলের নামগুলি একই হয়; এটি জটিল হতে পারে :-)
আব্বাফাই

আমাদের কি ফাইলগুলি বাছাই করা উচিত?
সিএমসিডিগ্রাগনকাই

@ সিএমসিডিগ্রাগনকাই: আপনার মানে কী? প্রথম ক্ষেত্রে, আমরা ফাইলের নামের তালিকাটি বাছাই করি । দ্বিতীয় ক্ষেত্রে, আমরা উদ্দেশ্যমূলকভাবে করি না কারণ প্রথম বাক্যে জোর দেওয়া কোনও কিছুর একটি অংশটি হ'ল ডিরেক্টরিতে ফাইলের ক্রম পরিবর্তন হয়েছে, সুতরাং আপনি কোনও কিছু বাছাই করতে চাইবেন না।
ওয়ারেন ইয়ং

@ ওয়ারেন ইউইং আপনি কি আরও কিছুটা ব্যাখ্যা করতে পারেন কেন বিকল্প 2 সর্বদা ভাল নয়? এটি দ্রুত, সহজ এবং আরও ক্রস প্ল্যাটফর্ম বলে মনে হচ্ছে। কোন ক্ষেত্রে এটি বিকল্প 1 হওয়া উচিত নয়?
রবিন উইনস্লো

বিকল্প 1 বিকল্প: find somedir -type f -exec sh -c "openssl dgst -sha1 -binary {} | xxd -p" \; | sort | openssl dgst -sha1সমস্ত ফাইলের নাম উপেক্ষা (নতুন
লাইনের

38

চেকসামটি স্ট্রিং হিসাবে ফাইলগুলির একটি নির্বিচারক এবং দ্ব্যর্থহীন প্রতিনিধিত্ব হওয়া দরকার। নির্ধারিত অর্থ হ'ল আপনি যদি একই ফাইলগুলিকে একই জায়গায় রাখেন তবে আপনি একই ফলাফল পাবেন। দ্ব্যর্থহীন অর্থ ফাইলের দুটি পৃথক সেটের আলাদা উপস্থাপনা থাকে।

ডেটা এবং মেটাডেটা

ফাইলগুলি সংরক্ষণাগার তৈরি করা একটি ভাল শুরু। এটি একটি দ্ব্যর্থহীন প্রতিনিধিত্ব (স্পষ্টতই, যেহেতু আপনি সংরক্ষণাগারটি বের করে ফাইলগুলি পুনরুদ্ধার করতে পারেন)। এটিতে ফাইলের মেটাডেটা যেমন তারিখ এবং মালিকানা অন্তর্ভুক্ত থাকতে পারে। তবে এটি এখনও একেবারেই ঠিক নয়: একটি সংরক্ষণাগার অস্পষ্ট, কারণ এর প্রতিনিধিত্ব নির্ভর করে যে ফাইলগুলি সংরক্ষণ করা হয়েছে তার উপর এবং সংক্ষেপণের ক্ষেত্রে প্রযোজ্য কিনা on

একটি সমাধান হ'ল ফাইলের নাম সংরক্ষণাগারভুক্ত করার আগে তাদের নামগুলি সাজানো। যদি আপনার ফাইলের নামগুলিতে নিউলাইনগুলি না থাকে তবে আপনি find | sortসেগুলি তালিকাভুক্ত করতে চালাতে পারেন এবং এই ক্রমে সংরক্ষণাগারে এগুলি যুক্ত করতে পারেন। ডিরেক্টরিতে পুনরাবৃত্তি না করতে ধনুকে বলার যত্ন নিন। এখানে পসিএক্স pax, জিএনইউ টার এবং সিপিও সহ উদাহরণ রয়েছে :

find | LC_ALL=C sort | pax -w -d | md5sum
find | LC_ALL=C sort | tar -cf - -T - --no-recursion | md5sum
find | LC_ALL=C sort | cpio -o | md5sum

কেবলমাত্র নাম এবং বিষয়বস্তু, নিম্ন প্রযুক্তির উপায়

আপনি যদি কেবল ফাইলের ডেটা অ্যাকাউন্টে নিতে চান এবং মেটাডেটা না করেন তবে আপনি একটি সংরক্ষণাগার তৈরি করতে পারেন যাতে কেবল ফাইলের বিষয়বস্তু অন্তর্ভুক্ত থাকে তবে এর জন্য কোনও মানক সরঞ্জাম নেই। ফাইল সামগ্রী অন্তর্ভুক্ত করার পরিবর্তে, আপনি ফাইলগুলির হ্যাশ অন্তর্ভুক্ত করতে পারেন। যদি ফাইলের নামগুলিতে কোনও নিউলাইন থাকে না, এবং কেবল নিয়মিত ফাইল এবং ডিরেক্টরি থাকে (কোনও প্রতীকী লিঙ্ক বা বিশেষ ফাইল নেই) তবে এটি মোটামুটি সহজ তবে আপনার কয়েকটি বিষয় যত্ন নেওয়া দরকার:

{ export LC_ALL=C;
  find -type f -exec wc -c {} \; | sort; echo;
  find -type f -exec md5sum {} + | sort; echo;
  find . -type d | sort; find . -type d | sort | md5sum;
} | md5sum

আমরা চেকসামগুলির তালিকা ছাড়াও একটি ডিরেক্টরি তালিকা অন্তর্ভুক্ত করি, অন্যথায় খালি ডিরেক্টরিগুলি অদৃশ্য হবে। ফাইল তালিকাটি বাছাই করা হয়েছে (একটি নির্দিষ্ট, পুনরুত্পাদনযোগ্য লোকালে - পিটারকে ধন্যবাদ। ও আমাকে এটির স্মরণ করিয়ে দেওয়ার জন্য)। echoদুটি অংশ পৃথক করে (এটি ব্যতীত আপনি কিছু খালি ডিরেক্টরি তৈরি করতে পারেন যার নাম দেখতে md5sumআউটপুট যেমন সাধারণ ফাইলগুলির জন্যও যেতে পারে)। দৈর্ঘ্য-প্রসারের আক্রমণগুলি এড়াতে আমরা ফাইল আকারের একটি তালিকাও অন্তর্ভুক্ত করি ।

উপায় দ্বারা, MD5 অবমূল্যায়ন করা হয়। এটি উপলভ্য থাকলে SHA-2 ব্যবহার করুন বা কমপক্ষে SHA-1 ব্যবহার করুন।

নাম এবং ডেটা, নামগুলিতে নতুন লাইনের সমর্থন করে

এখানে উপরের কোডের একটি বৈকল্পিক যা নাল বাইট সহ ফাইলের নাম পৃথক করতে জিএনইউ সরঞ্জামগুলিতে নির্ভর করে। এটি ফাইলের নামগুলিকে নিউলাইনগুলি ধারণ করতে দেয়। জিএনইউ ডাইজেস্ট ইউটিলিটিগুলি তাদের আউটপুটে বিশেষ অক্ষরগুলি উদ্ধৃত করে, সুতরাং দ্ব্যর্থক নিউলাইনগুলি হবে না।

{ export LC_ALL=C;
  du -0ab | sort -z; # file lengths, including directories (with length 0)
  echo | tr '\n' '\000'; # separator
  find -type f -exec sha256sum {} + | sort -z; # file hashes
  echo | tr '\n' '\000'; # separator
  echo "End of hashed data."; # End of input marker
} | sha256sum

আরও দৃust় পদ্ধতির

এখানে একটি সর্বনিম্ন পরীক্ষিত পাইথন স্ক্রিপ্ট যা ফাইলগুলির শ্রেণিবিন্যাসের বর্ণনা দিয়ে একটি হ্যাশ তৈরি করে। এটি অ্যাকাউন্টে ডিরেক্টরি এবং ফাইলের সামগ্রীগুলি নেয় এবং প্রতীকী লিঙ্ক এবং অন্যান্য ফাইলগুলি উপেক্ষা করে এবং কোনও ফাইল পড়তে না পারলে মারাত্মক ত্রুটি ঘটায়।

#! /usr/bin/env python
import hashlib, hmac, os, stat, sys
## Return the hash of the contents of the specified file, as a hex string
def file_hash(name):
    f = open(name)
    h = hashlib.sha256()
    while True:
        buf = f.read(16384)
        if len(buf) == 0: break
        h.update(buf)
    f.close()
    return h.hexdigest()
## Traverse the specified path and update the hash with a description of its
## name and contents
def traverse(h, path):
    rs = os.lstat(path)
    quoted_name = repr(path)
    if stat.S_ISDIR(rs.st_mode):
        h.update('dir ' + quoted_name + '\n')
        for entry in sorted(os.listdir(path)):
            traverse(h, os.path.join(path, entry))
    elif stat.S_ISREG(rs.st_mode):
        h.update('reg ' + quoted_name + ' ')
        h.update(str(rs.st_size) + ' ')
        h.update(file_hash(path) + '\n')
    else: pass # silently symlinks and other special files
h = hashlib.sha256()
for root in sys.argv[1:]: traverse(h, root)
h.update('end\n')
print h.hexdigest()

ঠিক আছে, এটি কাজ করে, ধন্যবাদ। তবে কোনও মেটাডেটা না করে এটি করার কোনও উপায় আছে কি? এই মুহূর্তে আমার কেবল আসল বিষয়বস্তুর জন্য এটি প্রয়োজন।

LC_ALL=C sortবিভিন্ন পরিবেশ থেকে কীভাবে চেক করা যায় ... (+ 1
বিটিডাব্লু

আপনি এটির জন্য একটি পুরো পাইথন প্রোগ্রাম তৈরি করেছেন? ধন্যবাদ! এটি আমার প্রত্যাশার চেয়ে সত্যই বেশি। :-) যাইহোক, আমি এই পদ্ধতিগুলি পাশাপাশি ওয়ারেনের নতুন বিকল্প 1 টিও পরীক্ষা করব।

ভাল উত্তর. LC_ALL=Cএকাধিক মেশিন এবং ওএসগুলিতে চলমান থাকলে সাজানোর ক্রমটি সেট করা প্রয়োজনীয়।
কিউবারিক

কী cpio -o -মানে? সিপিও কি ডিফল্টভাবে স্টিডিন / আউট ব্যবহার করে না? জিএনইউ cpio: Too many arguments
সিপিও

12

কটাক্ষপাত আছে md5deep । এমডি 5 প্রদীপের কয়েকটি বৈশিষ্ট্য যা আপনার আগ্রহী হতে পারে:

রিকার্সিভ অপারেশন - এমডি 5 প্রদীপ একটি সম্পূর্ণ ডিরেক্টরি ট্রিকে পুনরাবৃত্ত করতে সক্ষম হয়। এটি, ডিরেক্টরিতে প্রতিটি ফাইলের জন্য এবং প্রতিটি উপ ডিরেক্টরিতে প্রতিটি ফাইলের জন্য MD5 গণনা করুন।

তুলনা মোড - এমডি 5 ডিপি পরিচিত হ্যাশগুলির একটি তালিকা গ্রহণ করতে পারে এবং সেগুলি ইনপুট ফাইলগুলির একটি সেটের সাথে তুলনা করতে পারে। প্রোগ্রামটি হয় সেই সমস্ত ইনপুট ফাইলগুলি সনাক্ত করতে পারে যা পরিচিত হ্যাশগুলির তালিকার সাথে মেলে বা মেলে না।

...


চমৎকার, কিন্তু এটি কাজ করতে পারে না, এটি বলে .../foo: Is a directory, কী দেয়?
ক্যামিলো মার্টিন

3
এটি নিজের একচেটিয়া এমডি 5সাম মুদ্রণ না করে নিজের এমডি 5 ডিপি ওপির সমস্যা সমাধান করে না, এটি কেবল ডিরেক্টরিতে প্রতিটি ফাইলের জন্য এমডি 5sum প্রিন্ট করে। তাই বলা হয়, আপনি md5deep আউটপুট একাধিক md5sum পারেন - না বেশ কি ওপি চেয়েছিলেন, কিন্তু পাসে! উদাহরণস্বরূপ বর্তমান ডিরেক্টরিটির জন্য: md5deep -r -l -j0 . | md5sum(যেখানে -rপুনরাবৃত্ত হয়, তার -lঅর্থ "আপেক্ষিক পাথগুলি ব্যবহার করুন" যাতে দুটি ডিরেক্টরি সামগ্রীর তুলনা করার সময় ফাইলগুলির পরম পথ হস্তক্ষেপ না করে এবং -j0অ-নির্ধারিত কারণে প্রতিরোধ করতে 1 টি থ্রেড ব্যবহার করে পৃথক md5sums বিভিন্ন অর্ডারে ফিরে আসার জন্য)।
স্টেভি

পথে কিছু ফাইল / ডিরেক্টরি উপেক্ষা করবেন কীভাবে?
সন্দীপন নাথ

9

যদি আপনার লক্ষ্যটি কেবল দুটি ডিরেক্টরির মধ্যে পার্থক্য খুঁজে পাওয়া যায় তবে ডিফ ব্যবহার করে বিবেচনা করুন।

এটা চেষ্টা কর:

diff -qr dir1 dir2

হ্যাঁ, এটিও কার্যকর। আমি মনে করি আপনি এই কমান্ডে dir1 dir2 বোঝাতে চেয়েছিলেন।

1
আমি এগুলি এড়াতে পারলে আমি সাধারণত জিইউআই ব্যবহার করি না, তবে ডিরেক্টরি ডিফাইটিংয়ের জন্য কেডিফ 3 দুর্দান্ত এবং অনেকগুলি প্ল্যাটফর্মেও কাজ করে।
সাইনলাও

পৃথক পৃথক ফাইলগুলিও এই আদেশের সাথে প্রতিবেদন করা হয়েছে।
সার্জ Stroobandt

7

আপনি প্রতিটি ফাইল পুনরাবৃত্তভাবে হ্যাশ করতে পারেন এবং তারপরে ফলাফলটি পাঠ্য হ্যাশ করতে পারেন:

> md5deep -r -l . | sort | md5sum
d43417958e47758c6405b5098f151074 *-

এমডি 5 ডিপি প্রয়োজন।


1
উবুন্টু 16.04 এর পরিবর্তে md5deepব্যবহার hashdeepকরার পরিবর্তে এমডি 5 ডিপ প্যাকেজ হ্যাশদীপের জন্য কেবলমাত্র একটি ট্রানজিশনাল ডামি।
পলিক

1
আমি হ্যাশদীপ চেষ্টা করেছি। এটি কেবল হ্যাশগুলিকেই নয় কেবল ## Invoked from: /home/myuser/dev/আপনার বর্তমান পথ এবং সহ কিছু শিরোনামও সরবরাহ করে ## $ hashdeep -s -r -l ~/folder/। এটি সাজানো হয়েছে, সুতরাং আপনি যদি আপনার বর্তমান ফোল্ডার বা কমান্ড লাইন পরিবর্তন করেন তবে চূড়ান্ত হ্যাশটি আলাদা হবে।
ট্রুফ

3

ফাইলের নাম বাদ দিয়ে কেবল ফাইল সামগ্রী contents

আমার এমন একটি সংস্করণ প্রয়োজন যা কেবলমাত্র ফাইলের নামগুলি পরীক্ষা করে কারণ সামগ্রীগুলি বিভিন্ন ডিরেক্টরিতে থাকে।

এই সংস্করণটি (ওয়ারেন ইয়ংয়ের উত্তর) অনেক সাহায্য করেছিল, তবে আমার সংস্করণ md5sumফাইলনামটি আউটপুট করেছিল (যে পথে আমি কমান্ডটি চালিয়েছি তার সাথে সম্পর্কিত) এবং ফোল্ডারের নামগুলি পৃথক ছিল, অতএব পৃথক ফাইল চেকসামের মিল থাকলেও চূড়ান্ত চেকসামটি করা হয়নি 'টি।

এটি ঠিক করার জন্য, আমার ক্ষেত্রে আমার findআউটপুটটির প্রতিটি লাইন থেকে ফাইলের নামটি সরিয়ে ফেলতে হবে (স্পেস দ্বারা পৃথক পৃথক পৃথক পৃথক প্রথম শব্দটিই নির্বাচন করুন cut):

find -s somedir -type f -exec md5sum {} \; | cut -d" " -f1 | md5sum

একটি পুনরুত্পাদনযোগ্য তালিকা পেতে আপনার চেকসামগুলি বাছাই করতে পারে।
মার্চকে উপস্থাপিত

3

সমাধান :

$ pip install checksumdir
$ checksumdir -a md5 assets/js
981ac0bc890de594a9f2f40e00f13872
$ checksumdir -a sha1 assets/js
88cd20f115e31a1e1ae381f7291d0c8cd3b92fad

কাজ দ্রুত এবং সহজ সমাধান তারপর ব্যাশ স্ক্রিপ্টিং।

দস্তাবেজটি দেখুন: https://pypi.python.org/pypi/checksumdir/1.0.5


যদি আপনার কাছে পাইপ না থাকে তবে আপনাকে এটি yum -y ইনস্টল করার দরকার হতে পারে পাইথন-পিপ ইনস্টল করুন (বা dnf / apt-get)
দিমিত্রিসেমেনভ

3

nix-hashনিক্স প্যাকেজ ম্যানেজারের কাছ থেকে

নিক্স-হ্যাশ কমান্ডটি প্রতিটি পাথের সামগ্রীর ক্রিপ্টোগ্রাফিক হ্যাশ গণনা করে স্ট্যান্ডার্ড আউটপুটে প্রিন্ট করে। ডিফল্টরূপে এটি একটি MD5 হ্যাশ গণনা করে তবে অন্যান্য হ্যাশ অ্যালগরিদমগুলিও উপলব্ধ। হ্যাশটি হেক্সাডেসিমালে মুদ্রিত হয়েছে।

প্রতিটি পাথের ক্রমিকায়নের জন্য হ্যাশটি গণনা করা হয়: পথে ফাইল সিস্টেম গাছের একটি ডাম্প। এটি নিয়মিত ফাইলের পাশাপাশি ডিরেক্টরি এবং সিমলিংকগুলি হ্যাশ করতে দেয়। ডাম্পটি এনএআর-ফরমেটে রয়েছে নিক্স-স্টোর --ডাম্প দ্বারা উত্পাদিত। সুতরাং, নিক্স-হ্যাশ পাথটি নিক্স-স্টোর - ডাম্প পাথের মতো একই ক্রিপ্টোগ্রাফিক হ্যাশ দেয় একাধিক md5sum।


2

আমি আমার স্নিপেটটি মাঝারি পরিমাণে ব্যবহার করব :

find . -xdev -type f -print0 | LC_COLLATE=C sort -z | xargs -0 cat | md5sum -

এবং এটি XXXL এর জন্য :

find . -xdev -type f -print0 | LC_COLLATE=C sort -z | xargs -0 tail -qc100 | md5sum -


কী -xdevপতাকা না?
czerasz

man find
এটিতে

ভাল যুক্তি :-). -xdev Don't descend directories on other filesystems.
czerasz

1
নোট করুন যে এটি নতুন, খালি ফাইলগুলিকে উপেক্ষা করে (যদি আপনি কোনও ফাইল স্পর্শ করেন তবে)।
রনজহান

এমন অনেকগুলি ক্ষেত্রে রয়েছে যেখানে এটি সম্পূর্ণ আলাদা ফাইল এবং ডিরেক্টরি কাঠামোর সাথে একই এমডি 5সাম উপার্জন করবে। ফাইল এবং ডিরেক্টরিগুলির নাম পরিবর্তন করা যদি এগুলি ফাইলগুলির ক্রম ক্রম পরিবর্তন না করে তবে তা একেবারেই পরিবর্তন হবে না। সুতরাং আমি এই পদ্ধতির সুপারিশ করব না।
হ্যান্স-পিটার স্টার

2

একটি ভাল গাছের চেক-সমষ্টি হ'ল গিটের ট্রি-আইডি।

দুর্ভাগ্যক্রমে এমন কোনও একক সরঞ্জাম উপলব্ধ নেই যা এটি করতে পারে (কমপক্ষে আমি এটি জানি না) তবে আপনি যদি গিটের হাতের মুঠোয় থাকেন তবে আপনি কেবল একটি নতুন সংগ্রহশালা স্থাপনের ভান করতে পারেন এবং সূচিগুলিতে যাচাই করতে চান এমন ফাইলগুলি যুক্ত করতে পারেন।

এটি আপনাকে (পুনরুত্পাদনযোগ্য) ট্রি হ্যাশ উত্পাদন করতে দেয় - এতে কেবল সামগ্রী, ফাইলের নাম এবং কিছু হ্রাস করা ফাইল মোড (এক্সিকিউটেবল) থাকে।


2

এই দুর্দান্ত উত্তরের অনুসরণ হিসাবে , যদি আপনি নিজেকে একটি বৃহত ডিরেক্টরিতে চেকসামের গণনা দ্রুত করতে চান বলে মনে করেন তবে জিএনইউ সমান্তরাল চেষ্টা করুন :

find -s somedir -type f | parallel -k -n 100 md5 {} | md5

(এটি একটি ম্যাক ব্যবহার করে md5প্রয়োজনীয় হিসাবে প্রতিস্থাপন করুন))

-kপতাকা গুরুত্বপূর্ণ, যে নির্দেশ parallelঅন্যথায় সামগ্রিক যোগফল চালানোর এমনকি যদি ফাইল সব একই চালানো পরিবর্তন করতে পারেন শৃঙ্খলা বজায় রাখার জন্য। 100 টি আর্গুমেন্টের সাথে -n 100প্রতিটি উদাহরণ চালানোর জন্য বলে md5, এটি একটি প্যারামিটার যা আপনি সবচেয়ে ভাল রানের জন্য টুইঙ্ক করতে পারেন। এর -Xপতাকাও দেখুন parallel(যদিও আমার ব্যক্তিগত ক্ষেত্রে এটি একটি ত্রুটি সৃষ্টি করেছিল))


1

একটি স্ক্রিপ্ট যা ভালভাবে পরীক্ষিত এবং ডুপ্লিকেট সন্ধান করা, ডেটা এবং মেটাডেটা উভয় ক্ষেত্রে তুলনা করা, সংযোজনগুলির পাশাপাশি পরিবর্তন এবং অপসারণগুলি প্রদর্শন সহ বেশ কয়েকটি ক্রিয়াকলাপ সমর্থন করে, আপনি ফিঙ্গারপ্রিন্ট পছন্দ করতে পারেন ।

আঙুলের ছাপ এখনই ডিরেক্টরিতে একটি একক চেকসাম তৈরি করে না, তবে একটি ট্রান্সক্রিপ্ট ফাইল যা সেই ডিরেক্টরিতে সমস্ত ফাইলের জন্য চেকসাম অন্তর্ভুক্ত করে।

fingerprint analyze

এটি index.fingerprintবর্তমান ডিরেক্টরিতে উত্পন্ন হবে যার মধ্যে চেকসাম, ফাইলের নাম এবং ফাইলের আকার রয়েছে। ডিফল্টরূপে এটি MD5এবং উভয়ই ব্যবহার করে SHA1.256

ভবিষ্যতে, আমি মর্কলে গাছগুলির জন্য ফিঙ্গারপ্রিন্টে সমর্থন যুক্ত করার আশাবাদী যা আপনাকে একক শীর্ষ স্তরের চেকসাম দেবে। এখনই, আপনাকে যাচাই করার জন্য সেই ফাইলটি ধরে রাখা দরকার।


1

আমি নতুন এক্সিকিউটেবল বা আড়ম্বরপূর্ণ সমাধান চাইনি তাই এখানে আমার গ্রহণ করুন:

#!/bin/sh
# md5dir.sh by Camilo Martin, 2014-10-01.
# Give this a parameter and it will calculate an md5 of the directory's contents.
# It only takes into account file contents and paths relative to the directory's root.
# This means that two dirs with different names and locations can hash equally.

if [[ ! -d "$1" ]]; then
    echo "Usage: md5dir.sh <dir_name>"
    exit
fi

d="$(tr '\\' / <<< "$1" | tr -s / | sed 's-/$--')"
c=$((${#d} + 35))
find "$d" -type f -exec md5sum {} \; | cut -c 1-33,$c- | sort | md5sum | cut -c 1-32

0

একটি দৃust় এবং পরিষ্কার পদ্ধতির

  • প্রথম জিনিসগুলি, উপলভ্য মেমরিটিকে হোগ করবেন না ! পুরো ফাইলটি খাওয়ানোর চেয়ে অংশগুলিতে একটি ফাইল হ্যাশ করুন।
  • বিভিন্ন প্রয়োজন / প্রয়োজনের জন্য বিভিন্ন পন্থা (নীচের সমস্তটি বা যা যা প্রযোজ্য তা চয়ন করুন):
    • ডিরেক্টরি ট্রিটিতে কেবলমাত্র সমস্ত প্রবেশের নাম হ্যাশ করুন
    • সমস্ত এন্ট্রিগুলির ফাইলের বিষয়বস্তুগুলি হ্যাশ করুন (মেটা ছাড়াই, ইনোড নম্বর, সিটিটাইম, টাইম, এমটাইম, আকার ইত্যাদি) আপনি ধারণা পাবেন)
    • প্রতীকী লিঙ্কের জন্য, এর সামগ্রীটি আলাদা নাম। এটি হ্যাশ করুন বা এড়িয়ে যাওয়া বেছে নিন
    • প্রবেশের বিষয়বস্তুগুলি হ্যাশ করার সময় সিমিলিঙ্কটি অনুসরণ করুন (সমাধান হওয়া নাম) অনুসরণ করুন বা না করুন
    • যদি এটি কোনও ডিরেক্টরি হয় তবে এর বিষয়বস্তুগুলি কেবল ডিরেক্টরি এন্ট্রি। পুনরাবৃত্তিগুলি ট্র্যাভার করার সময় তারা শেষ পর্যন্ত হ্যাশ হবে তবে সেই স্তরের ডিরেক্টরি এন্ট্রি নামগুলি এই ডিরেক্টরিটি ট্যাগ করার জন্য হ্যাশ করা উচিত? ব্যবহারের ক্ষেত্রে সহায়ক যেখানে হ্যাশগুলির বিষয়বস্তুগুলি গভীরভাবে হ্যাশ না করে দ্রুত পরিবর্তন চিহ্নিত করতে হবে। একটি উদাহরণ কোনও ফাইলের নাম পরিবর্তন হতে পারে তবে বাকী বিষয়বস্তু একই থাকে এবং সেগুলি মোটামুটি বড় ফাইল
    • বড় ফাইলগুলি ভালভাবে পরিচালনা করুন (আবার, র‌্যামের মনে রাখবেন)
    • খুব গভীর ডিরেক্টরি গাছগুলি পরিচালনা করুন (ওপেন ফাইলের বর্ণনাকারীদের মনে রাখবেন)
    • নন স্ট্যান্ডার্ড ফাইলের নামগুলি হ্যান্ডেল করুন
    • সকেট, পাইপ / এফআইএফও, ব্লক ডিভাইস, চর ডিভাইসগুলির ফাইলগুলি কীভাবে এগিয়ে যাবে? তাদের পাশাপাশি হ্যাশ করতে হবে?
    • ট্র্যাভারিংয়ের সময় কোনও প্রবেশের অ্যাক্সেসের সময় আপডেট করবেন না কারণ এটি নির্দিষ্ট ব্যবহারের ক্ষেত্রে একটি পার্শ্ব প্রতিক্রিয়া এবং পাল্টা-উত্পাদনশীল (স্বজ্ঞাত?) হবে।

আমার মাথার উপরে এটিই রয়েছে, যে কেউ এই বিষয়ে কার্যত কিছু সময় ব্যয় করেছেন সে অন্য গোচা এবং কর্নারের কেস ধরে ফেলত।

এখানে একটি সরঞ্জাম রয়েছে (অস্বীকৃতি: আমি এর জন্য একটি সহযোগী) dtreetrawl , মেমরির উপর খুব হালকা, যা বেশিরভাগ ক্ষেত্রে সম্বোধন করে, প্রান্তগুলির চারপাশে কিছুটা রুক্ষ হতে পারে তবে এটি বেশ সহায়ক ছিল।

Usage:
  dtreetrawl [OPTION...] "/trawl/me" [path2,...]

Help Options:
  -h, --help                Show help options

Application Options:
  -t, --terse               Produce a terse output; parsable.
  -d, --delim=:             Character or string delimiter/separator for terse output(default ':')
  -l, --max-level=N         Do not traverse tree beyond N level(s)
  --hash                    Hash the files to produce checksums(default is MD5).
  -c, --checksum=md5        Valid hashing algorithms: md5, sha1, sha256, sha512.
  -s, --hash-symlink        Include symbolic links' referent name while calculating the root checksum
  -R, --only-root-hash      Output only the root hash. Blank line if --hash is not set
  -N, --no-name-hash        Exclude path name while calculating the root checksum
  -F, --no-content-hash     Do not hash the contents of the file

একটি মানব বান্ধব আউটপুট উদাহরণ:

...
... //clipped
...
/home/lab/linux-4.14-rc8/CREDITS
        Base name                    : CREDITS
        Level                        : 1
        Type                         : regular file
        Referent name                :
        File size                    : 98443 bytes
        I-node number                : 290850
        No. directory entries        : 0
        Permission (octal)           : 0644
        Link count                   : 1
        Ownership                    : UID=0, GID=0
        Preferred I/O block size     : 4096 bytes
        Blocks allocated             : 200
        Last status change           : Tue, 21 Nov 17 21:28:18 +0530
        Last file access             : Thu, 28 Dec 17 00:53:27 +0530
        Last file modification       : Tue, 21 Nov 17 21:28:18 +0530
        Hash                         : 9f0312d130016d103aa5fc9d16a2437e

Stats for /home/lab/linux-4.14-rc8:
        Elapsed time     : 1.305767 s
        Start time       : Sun, 07 Jan 18 03:42:39 +0530
        Root hash        : 434e93111ad6f9335bb4954bc8f4eca4
        Hash type        : md5
        Depth            : 8
        Total,
                size           : 66850916 bytes
                entries        : 12484
                directories    : 763
                regular files  : 11715
                symlinks       : 6
                block devices  : 0
                char devices   : 0
                sockets        : 0
                FIFOs/pipes    : 0

সাধারণ পরামর্শ সর্বদা স্বাগতম, তবে সর্বোত্তম উত্তর নির্দিষ্ট এবং কোড সহ উপযুক্ত যেখানে উপযুক্ত। আপনি যে সরঞ্জামটি উল্লেখ করেছেন তা ব্যবহার করার অভিজ্ঞতা যদি আপনার থাকে তবে দয়া করে এটি অন্তর্ভুক্ত করুন।
বু

@ bu5hman অবশ্যই! আমি এর বিকাশের সাথে জড়িত থাকায় এটি কতটা ভাল কাজ করে সে সম্পর্কে আরও কিছু বলতে (গ্লোটিং?) আমি বেশ স্বাচ্ছন্দ্য বোধ করি না।
ছয়-কে

0

প্রতিটি ডিরেক্টরিতে সমস্ত ফাইলের জন্য স্বতন্ত্রভাবে করছেন।

# Calculating
find dir1 | xargs md5sum > dir1.md5
find dir2 | xargs md5sum > dir2.md5
# Comparing (and showing the difference)
paste <(sort -k2 dir1.md5) <(sort -k2 dir2.md5) | awk '$1 != $3'

0

POSIX সংরক্ষণাগার বিন্যাসে মাইগ্রেশন GNU টার ভিত্তিক চেকসামগুলিকে প্রভাবিত করে

এই উত্তরটি টার্ন আউটপুটটি ডিরেক্টরিগুলির বিষয়বস্তুগুলি হ্যাশ করতে ব্যবহার করার পদ্ধতির একটি পরিপূরক আপডেট হিসাবে লক্ষ্য করা যেতে পারে, কারণ কিছুদিন আগে ওয়ারেন ইয়ং এবং গিলসের দুর্দান্ত উত্তরে এটি (অন্যান্য জিনিসের মধ্যে) প্রস্তাব করা হয়েছিল ।

তারপরে কমপক্ষে ওপেনসুএসই (এটি প্রকাশের পরে ১২.২) তাদের ডিফল্ট জিএনইউ টার ফর্ম্যাটটিকে "জিএনইউ টার 1.13.x ফর্ম্যাট" থেকে (সামান্য) উচ্চতর "পসিক্স 1003.1-2001 (প্যাক্স) ফর্ম্যাটে" পরিবর্তন করেছে । এছাড়াও প্রবাহিত (জিএনইউ টারের বিকাশকারীদের মধ্যে) একই মাইগ্রেশন সম্পাদন করতে তারা আলোচনা করে, উদাহরণস্বরূপ , জিএনইউ টার ম্যানুয়ালটির এই পৃষ্ঠার শেষ অনুচ্ছেদটি দেখুন :

GNU টার জন্য ডিফল্ট ফর্ম্যাট সংকলন সময়ে সংজ্ঞায়িত করা হয়। আপনি এটি চালিয়ে tar --helpএবং এর আউটপুটের শেষ লাইনগুলি পরীক্ষা করে এটি পরীক্ষা করতে পারেন । সাধারণত, GNU টার gnuফর্ম্যাটতে সংরক্ষণাগার তৈরির জন্য কনফিগার করা হয় তবে ভবিষ্যতের সংস্করণটি স্যুইচ হবে posix

(এই পৃষ্ঠাটি জিএনইউ টারের সাথে উপলভ্য বিভিন্ন সংরক্ষণাগার ফর্ম্যাটগুলিতেও একটি দুর্দান্ত পর্যালোচনা দেয়))

আমাদের ক্ষেত্রে, যেখানে আমরা ডিরেক্টরি সামগ্রী এবং হ্যাশ ফলাফলটি ট্যারেট করি এবং নির্দিষ্ট ব্যবস্থা না নিয়ে, জিএনইউ থেকে পোসিক্স ফর্ম্যাটে পরিবর্তনের নিম্নলিখিত পরিণতি হয়:

  • অভিন্ন ডিরেক্টরি সামগ্রী থাকা সত্ত্বেও, ফলস্বরূপ চেকসামটি পৃথক হবে।

  • অভিন্ন ডিরেক্টরি বিষয়বস্তু সত্ত্বেও, ডিফল্ট প্যাক্স শিরোলেখ ব্যবহার করা হলে ফলাফলের চেকসাম রান থেকে চালানো থেকে আলাদা হবে।

দ্বিতীয়টি সত্যটি থেকে আসে যে পসিক্স (প্যাক্স) ফর্ম্যাটে বর্ধিত প্যাক্স শিরোনাম অন্তর্ভুক্ত রয়েছে যা %d/PaxHeaders.%p/%fGNU টারে ডিফল্ট ফর্ম্যাট স্ট্রিং দ্বারা নির্ধারিত হয় । এই স্ট্রিংয়ের মধ্যে, সুনির্দিষ্টটি %pউত্পাদক টার প্রসেসের প্রসেস আইডি দ্বারা প্রতিস্থাপন করা হয়, যা অবশ্যই রান থেকে চালানো থেকে আলাদা। দেখুন এই বিভাগে এর গনুহ Tar থেকে ম্যানুয়াল এবং বিশেষ করে এই এক বিস্তারিত জানার জন্য।

এখনই, 2019-03-28 তারিখের মধ্যে, একটি প্রতিশ্রুতি গৃহীত প্রবাহ রয়েছে যা এই সমস্যাটিকে অস্বীকার করে।

সুতরাং, প্রদত্ত ব্যবহারের ক্ষেত্রে GNU টার ব্যবহার চালিয়ে যেতে সক্ষম হতে, আমি নিম্নলিখিত বিকল্প বিকল্পগুলির সুপারিশ করতে পারি:

  • --format=gnu"পুরানো" ফর্ম্যাটে সংরক্ষণাগারটি তৈরি করতে সুস্পষ্টভাবে তারকে বলার জন্য টার বিকল্পটি ব্যবহার করুন । এটি "পুরাতন" চেকসামগুলি বৈধ করা বাধ্যতামূলক।

  • আরও নতুন পসিক্স ফর্ম্যাটটি ব্যবহার করুন তবে স্পষ্টভাবে একটি উপযুক্ত প্যাক্স শিরোনাম নির্দিষ্ট করুন, উদাহরণস্বরূপ দ্বারা --pax-option="exthdr.name=%d/PaxHeaders/%f"। যাইহোক, এটি "পুরানো" চেকসামের পিছনে সামঞ্জস্যতা ভেঙে দেয়।

এখানে একটি বাশ কোড টুকরা যা আমি নিয়মিত ভিত্তিতে মেটাডেটা সহ ডিরেক্টরি সামগ্রীর চেকসামগুলি গণনা করতে ব্যবহার করি:

( export LC_ALL=C
  find <paths> ! -type s -print0 |
  sort -z |
  tar cp --format=gnu --numeric-owner \
         --atime-preserve \
         --no-recursion --null --files-from - |
  md5sum --binary; )

এখানে, <paths>আমি চেকসাম দ্বারা আচ্ছাদন করতে চাই এমন সমস্ত ডিরেক্টরিগুলির পাথের স্থান পৃথকীকরণের তালিকা দ্বারা প্রতিস্থাপন করা হয়েছে। সংরক্ষণাগারে ফাইল সিস্টেমের স্বতন্ত্র অর্ডার পেতে সি লোকেল, ফাইল নামগুলির নাল বাইট পৃথকীকরণ এবং অনুসন্ধান এবং বাছাইয়ের উদ্দেশ্য ইতিমধ্যে অন্যান্য উত্তরে যথেষ্ট আলোচনা করা হয়েছে।

আশেপাশের বন্ধনীগুলি LC_ALLসেটিংস স্থানীয়ভাবে একটি সাবশেলে রাখে।

উপরন্তু, আমি অভিব্যক্তি ব্যবহার ! -type sসঙ্গে findআলকাতরা থেকে সতর্কবার্তা যে ঘটতে যদি সকেট ফাইল ডিরেক্টরি বিষয়বস্তু অংশ এড়াতে: গনুহ Tar থেকে না সংরক্ষণাগার সকেট। যদি আপনি এড়িয়ে যাওয়া সকেট সম্পর্কে অবহিত হতে চান তবে সেই ভাবটি ছেড়ে দিন।

আমি --numeric-ownerটার সাথে ব্যবহার করি , এমনকি সিস্টেমগুলিতে চেকসামগুলি যাচাই করতে সক্ষম হতে, যেখানে ফাইলের সমস্ত মালিকের জানা নেই।

--atime-preserveTar থেকে জন্য বিকল্প কল্যাণকর, যদি বাদ দেওয়া হয় কোন <paths>একটি শুধুমাত্র পাঠযোগ্য মাউন্ট ডিভাইসে মিথ্যা। অন্যথায় আপনাকে প্রতিটি একক ফাইলের জন্য সতর্ক করা হবে যার অ্যাক্সেসের টাইমস্ট্যাম্প টার পুনরুদ্ধার করতে সক্ষম ছিল না। রাইটিং সক্ষম করার জন্য <paths>, আমি হ্যাশ ডিরেক্টরিগুলিতে অ্যাক্সেস টাইমস্ট্যাম্পগুলি সংরক্ষণ করার জন্য, এই বিকল্পটি ব্যবহার করি।

গার্লস প্রস্তাবনায়--no-recursion ইতিমধ্যে ব্যবহৃত তর বিকল্পটি নিজে থেকে ডিরেক্টরিগুলিতে পুনরাবৃত্তভাবে উত্থিত হওয়া থেকে এবং বাছাই করা আউটপুট থেকে যা খাওয়ানো হয় তার পরিবর্তে ফাইল পরিচালনার জন্য তারকে বাধা দেয় ।find

এবং পরিশেষে, এটি সত্য যে আমি ব্যবহার md5sumকরি না: আমি আসলে ব্যবহার করি sha256sum


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.