Md5sum প্রোগ্রাম ডিরেক্টরিগুলির জন্য চেকসাম সরবরাহ করে না। আমি সাব ডিরেক্টরি ডিরেক্টরি ফাইল সহ একটি ডিরেক্টরি পুরো সামগ্রীর জন্য একটি একক MD5 চেকসাম পেতে চাই। এটি হ'ল, সমস্ত ফাইলগুলির মধ্যে একটি সমন্বিত চেকসাম। এই কাজ করতে একটি উপায় আছে কি?
Md5sum প্রোগ্রাম ডিরেক্টরিগুলির জন্য চেকসাম সরবরাহ করে না। আমি সাব ডিরেক্টরি ডিরেক্টরি ফাইল সহ একটি ডিরেক্টরি পুরো সামগ্রীর জন্য একটি একক MD5 চেকসাম পেতে চাই। এটি হ'ল, সমস্ত ফাইলগুলির মধ্যে একটি সমন্বিত চেকসাম। এই কাজ করতে একটি উপায় আছে কি?
উত্তর:
সঠিক উপায় আপনি কেন জিজ্ঞাসা করছেন তার উপর নির্ভর করে:
আপনার যদি কেবল গাছের ফাইলের সামগ্রীগুলির একটি হ্যাশ দরকার হয় তবে এটি কৌশলটি করবে:
$ 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
এই পদ্ধতিটি কিছুটা অক্ষম, md5sum
N + 1 বার কল করে যেখানে N গাছের মধ্যে ফাইলগুলির সংখ্যা, তবে ফাইল এবং ডিরেক্টরি মেটাডেটা হ্যাশিং এড়ানোর জন্য এটি প্রয়োজনীয় খরচ।
আপনার যদি কেবল কোনও ফাইলের বিষয়বস্তু নয়, গাছের যে কোনও কিছু পরিবর্তিত হয়েছে তা সনাক্ত করতে সক্ষম হতে tar
হবে তবে আপনার জন্য ডিরেক্টরি সামগ্রীটি প্যাক করতে বলুন, তারপরে এটি প্রেরণ করুন md5sum
:
$ tar -cf - somedir | md5sum
কারণ tar
ফাইল ফাইলের অনুমতি, মালিকানা ইত্যাদিও দেখায়, এটি কেবল ফাইলের সামগ্রীতে পরিবর্তন নয়, এই জিনিসগুলির পরিবর্তনগুলিও সনাক্ত করবে।
এই পদ্ধতিটি যথেষ্ট দ্রুত, কারণ এটি গাছের উপর দিয়ে কেবল একটি পাস করে এবং হ্যাশ প্রোগ্রামটি একবারে চালায় once
সঙ্গে find
ভিত্তিক পদ্ধতি উপরে tar
অর্ডার অন্তর্নিহিত ফাইলসিস্টেম তাদের ফেরৎ মধ্যে ফাইলের নাম প্রক্রিয়া করতে যাচ্ছে। আপনার আবেদনে এটি খুব ভাল হতে পারে আপনি নিশ্চিত হতে পারেন যে আপনি এটি ঘটবে না। আমি কমপক্ষে তিনটি পৃথক ব্যবহারের ধরণগুলি ভাবতে পারি যেখানে সম্ভবত এটিই ঘটবে। (আমি তাদের তালিকা বদ্ধ করতে যাচ্ছি না, কারণ আমরা অনির্ধারিত আচরণের অঞ্চলে gettingুকছি Each প্রতিটি ফাইল সিস্টেম এখানে আলাদা আলাদা হতে পারে, এমনকি ওএসের একটি সংস্করণ থেকে পরের সংস্করণেও))
যদি আপনি নিজেকে মিথ্যা ধনাত্মক হয়ে উঠতে দেখেন তবে আমি গিলসের উত্তরেরfind | cpio
বিকল্পটি নিয়ে যাওয়ার পরামর্শ দিচ্ছি ।
find somedir -type f -exec sh -c "openssl dgst -sha1 -binary {} | xxd -p" \; | sort | openssl dgst -sha1
সমস্ত ফাইলের নাম উপেক্ষা (নতুন
চেকসামটি স্ট্রিং হিসাবে ফাইলগুলির একটি নির্বিচারক এবং দ্ব্যর্থহীন প্রতিনিধিত্ব হওয়া দরকার। নির্ধারিত অর্থ হ'ল আপনি যদি একই ফাইলগুলিকে একই জায়গায় রাখেন তবে আপনি একই ফলাফল পাবেন। দ্ব্যর্থহীন অর্থ ফাইলের দুটি পৃথক সেটের আলাদা উপস্থাপনা থাকে।
ফাইলগুলি সংরক্ষণাগার তৈরি করা একটি ভাল শুরু। এটি একটি দ্ব্যর্থহীন প্রতিনিধিত্ব (স্পষ্টতই, যেহেতু আপনি সংরক্ষণাগারটি বের করে ফাইলগুলি পুনরুদ্ধার করতে পারেন)। এটিতে ফাইলের মেটাডেটা যেমন তারিখ এবং মালিকানা অন্তর্ভুক্ত থাকতে পারে। তবে এটি এখনও একেবারেই ঠিক নয়: একটি সংরক্ষণাগার অস্পষ্ট, কারণ এর প্রতিনিধিত্ব নির্ভর করে যে ফাইলগুলি সংরক্ষণ করা হয়েছে তার উপর এবং সংক্ষেপণের ক্ষেত্রে প্রযোজ্য কিনা 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
এখানে একটি সর্বনিম্ন পরীক্ষিত পাইথন স্ক্রিপ্ট যা ফাইলগুলির শ্রেণিবিন্যাসের বর্ণনা দিয়ে একটি হ্যাশ তৈরি করে। এটি অ্যাকাউন্টে ডিরেক্টরি এবং ফাইলের সামগ্রীগুলি নেয় এবং প্রতীকী লিঙ্ক এবং অন্যান্য ফাইলগুলি উপেক্ষা করে এবং কোনও ফাইল পড়তে না পারলে মারাত্মক ত্রুটি ঘটায়।
#! /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
LC_ALL=C
একাধিক মেশিন এবং ওএসগুলিতে চলমান থাকলে সাজানোর ক্রমটি সেট করা প্রয়োজনীয়।
cpio -o -
মানে? সিপিও কি ডিফল্টভাবে স্টিডিন / আউট ব্যবহার করে না? জিএনইউ cpio: Too many arguments
কটাক্ষপাত আছে md5deep । এমডি 5 প্রদীপের কয়েকটি বৈশিষ্ট্য যা আপনার আগ্রহী হতে পারে:
রিকার্সিভ অপারেশন - এমডি 5 প্রদীপ একটি সম্পূর্ণ ডিরেক্টরি ট্রিকে পুনরাবৃত্ত করতে সক্ষম হয়। এটি, ডিরেক্টরিতে প্রতিটি ফাইলের জন্য এবং প্রতিটি উপ ডিরেক্টরিতে প্রতিটি ফাইলের জন্য MD5 গণনা করুন।
তুলনা মোড - এমডি 5 ডিপি পরিচিত হ্যাশগুলির একটি তালিকা গ্রহণ করতে পারে এবং সেগুলি ইনপুট ফাইলগুলির একটি সেটের সাথে তুলনা করতে পারে। প্রোগ্রামটি হয় সেই সমস্ত ইনপুট ফাইলগুলি সনাক্ত করতে পারে যা পরিচিত হ্যাশগুলির তালিকার সাথে মেলে বা মেলে না।
...
.../foo: Is a directory
, কী দেয়?
md5deep -r -l -j0 . | md5sum
(যেখানে -r
পুনরাবৃত্ত হয়, তার -l
অর্থ "আপেক্ষিক পাথগুলি ব্যবহার করুন" যাতে দুটি ডিরেক্টরি সামগ্রীর তুলনা করার সময় ফাইলগুলির পরম পথ হস্তক্ষেপ না করে এবং -j0
অ-নির্ধারিত কারণে প্রতিরোধ করতে 1 টি থ্রেড ব্যবহার করে পৃথক md5sums বিভিন্ন অর্ডারে ফিরে আসার জন্য)।
যদি আপনার লক্ষ্যটি কেবল দুটি ডিরেক্টরির মধ্যে পার্থক্য খুঁজে পাওয়া যায় তবে ডিফ ব্যবহার করে বিবেচনা করুন।
এটা চেষ্টা কর:
diff -qr dir1 dir2
আপনি প্রতিটি ফাইল পুনরাবৃত্তভাবে হ্যাশ করতে পারেন এবং তারপরে ফলাফলটি পাঠ্য হ্যাশ করতে পারেন:
> md5deep -r -l . | sort | md5sum
d43417958e47758c6405b5098f151074 *-
এমডি 5 ডিপি প্রয়োজন।
md5deep
ব্যবহার hashdeep
করার পরিবর্তে এমডি 5 ডিপ প্যাকেজ হ্যাশদীপের জন্য কেবলমাত্র একটি ট্রানজিশনাল ডামি।
## Invoked from: /home/myuser/dev/
আপনার বর্তমান পথ এবং সহ কিছু শিরোনামও সরবরাহ করে ## $ hashdeep -s -r -l ~/folder/
। এটি সাজানো হয়েছে, সুতরাং আপনি যদি আপনার বর্তমান ফোল্ডার বা কমান্ড লাইন পরিবর্তন করেন তবে চূড়ান্ত হ্যাশটি আলাদা হবে।
আমার এমন একটি সংস্করণ প্রয়োজন যা কেবলমাত্র ফাইলের নামগুলি পরীক্ষা করে কারণ সামগ্রীগুলি বিভিন্ন ডিরেক্টরিতে থাকে।
এই সংস্করণটি (ওয়ারেন ইয়ংয়ের উত্তর) অনেক সাহায্য করেছিল, তবে আমার সংস্করণ md5sum
ফাইলনামটি আউটপুট করেছিল (যে পথে আমি কমান্ডটি চালিয়েছি তার সাথে সম্পর্কিত) এবং ফোল্ডারের নামগুলি পৃথক ছিল, অতএব পৃথক ফাইল চেকসামের মিল থাকলেও চূড়ান্ত চেকসামটি করা হয়নি 'টি।
এটি ঠিক করার জন্য, আমার ক্ষেত্রে আমার find
আউটপুটটির প্রতিটি লাইন থেকে ফাইলের নামটি সরিয়ে ফেলতে হবে (স্পেস দ্বারা পৃথক পৃথক পৃথক পৃথক প্রথম শব্দটিই নির্বাচন করুন cut
):
find -s somedir -type f -exec md5sum {} \; | cut -d" " -f1 | md5sum
সমাধান :
$ pip install checksumdir
$ checksumdir -a md5 assets/js
981ac0bc890de594a9f2f40e00f13872
$ checksumdir -a sha1 assets/js
88cd20f115e31a1e1ae381f7291d0c8cd3b92fad
কাজ দ্রুত এবং সহজ সমাধান তারপর ব্যাশ স্ক্রিপ্টিং।
দস্তাবেজটি দেখুন: https://pypi.python.org/pypi/checksumdir/1.0.5
nix-hash
নিক্স প্যাকেজ ম্যানেজারের কাছ থেকে
নিক্স-হ্যাশ কমান্ডটি প্রতিটি পাথের সামগ্রীর ক্রিপ্টোগ্রাফিক হ্যাশ গণনা করে স্ট্যান্ডার্ড আউটপুটে প্রিন্ট করে। ডিফল্টরূপে এটি একটি MD5 হ্যাশ গণনা করে তবে অন্যান্য হ্যাশ অ্যালগরিদমগুলিও উপলব্ধ। হ্যাশটি হেক্সাডেসিমালে মুদ্রিত হয়েছে।
প্রতিটি পাথের ক্রমিকায়নের জন্য হ্যাশটি গণনা করা হয়: পথে ফাইল সিস্টেম গাছের একটি ডাম্প। এটি নিয়মিত ফাইলের পাশাপাশি ডিরেক্টরি এবং সিমলিংকগুলি হ্যাশ করতে দেয়। ডাম্পটি এনএআর-ফরমেটে রয়েছে নিক্স-স্টোর --ডাম্প দ্বারা উত্পাদিত। সুতরাং, নিক্স-হ্যাশ পাথটি নিক্স-স্টোর - ডাম্প পাথের মতো একই ক্রিপ্টোগ্রাফিক হ্যাশ দেয় একাধিক md5sum।
আমি আমার স্নিপেটটি মাঝারি পরিমাণে ব্যবহার করব :
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
পতাকা না?
man find
-xdev Don't descend directories on other filesystems.
একটি ভাল গাছের চেক-সমষ্টি হ'ল গিটের ট্রি-আইডি।
দুর্ভাগ্যক্রমে এমন কোনও একক সরঞ্জাম উপলব্ধ নেই যা এটি করতে পারে (কমপক্ষে আমি এটি জানি না) তবে আপনি যদি গিটের হাতের মুঠোয় থাকেন তবে আপনি কেবল একটি নতুন সংগ্রহশালা স্থাপনের ভান করতে পারেন এবং সূচিগুলিতে যাচাই করতে চান এমন ফাইলগুলি যুক্ত করতে পারেন।
এটি আপনাকে (পুনরুত্পাদনযোগ্য) ট্রি হ্যাশ উত্পাদন করতে দেয় - এতে কেবল সামগ্রী, ফাইলের নাম এবং কিছু হ্রাস করা ফাইল মোড (এক্সিকিউটেবল) থাকে।
এই দুর্দান্ত উত্তরের অনুসরণ হিসাবে , যদি আপনি নিজেকে একটি বৃহত ডিরেক্টরিতে চেকসামের গণনা দ্রুত করতে চান বলে মনে করেন তবে জিএনইউ সমান্তরাল চেষ্টা করুন :
find -s somedir -type f | parallel -k -n 100 md5 {} | md5
(এটি একটি ম্যাক ব্যবহার করে md5
প্রয়োজনীয় হিসাবে প্রতিস্থাপন করুন))
-k
পতাকা গুরুত্বপূর্ণ, যে নির্দেশ parallel
অন্যথায় সামগ্রিক যোগফল চালানোর এমনকি যদি ফাইল সব একই চালানো পরিবর্তন করতে পারেন শৃঙ্খলা বজায় রাখার জন্য। 100 টি আর্গুমেন্টের সাথে -n 100
প্রতিটি উদাহরণ চালানোর জন্য বলে md5
, এটি একটি প্যারামিটার যা আপনি সবচেয়ে ভাল রানের জন্য টুইঙ্ক করতে পারেন। এর -X
পতাকাও দেখুন parallel
(যদিও আমার ব্যক্তিগত ক্ষেত্রে এটি একটি ত্রুটি সৃষ্টি করেছিল))
একটি স্ক্রিপ্ট যা ভালভাবে পরীক্ষিত এবং ডুপ্লিকেট সন্ধান করা, ডেটা এবং মেটাডেটা উভয় ক্ষেত্রে তুলনা করা, সংযোজনগুলির পাশাপাশি পরিবর্তন এবং অপসারণগুলি প্রদর্শন সহ বেশ কয়েকটি ক্রিয়াকলাপ সমর্থন করে, আপনি ফিঙ্গারপ্রিন্ট পছন্দ করতে পারেন ।
আঙুলের ছাপ এখনই ডিরেক্টরিতে একটি একক চেকসাম তৈরি করে না, তবে একটি ট্রান্সক্রিপ্ট ফাইল যা সেই ডিরেক্টরিতে সমস্ত ফাইলের জন্য চেকসাম অন্তর্ভুক্ত করে।
fingerprint analyze
এটি index.fingerprint
বর্তমান ডিরেক্টরিতে উত্পন্ন হবে যার মধ্যে চেকসাম, ফাইলের নাম এবং ফাইলের আকার রয়েছে। ডিফল্টরূপে এটি MD5
এবং উভয়ই ব্যবহার করে SHA1.256
।
ভবিষ্যতে, আমি মর্কলে গাছগুলির জন্য ফিঙ্গারপ্রিন্টে সমর্থন যুক্ত করার আশাবাদী যা আপনাকে একক শীর্ষ স্তরের চেকসাম দেবে। এখনই, আপনাকে যাচাই করার জন্য সেই ফাইলটি ধরে রাখা দরকার।
আমি নতুন এক্সিকিউটেবল বা আড়ম্বরপূর্ণ সমাধান চাইনি তাই এখানে আমার গ্রহণ করুন:
#!/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
আমার মাথার উপরে এটিই রয়েছে, যে কেউ এই বিষয়ে কার্যত কিছু সময় ব্যয় করেছেন সে অন্য গোচা এবং কর্নারের কেস ধরে ফেলত।
এখানে একটি সরঞ্জাম রয়েছে (অস্বীকৃতি: আমি এর জন্য একটি সহযোগী) 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
প্রতিটি ডিরেক্টরিতে সমস্ত ফাইলের জন্য স্বতন্ত্রভাবে করছেন।
# 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'
এই উত্তরটি টার্ন আউটপুটটি ডিরেক্টরিগুলির বিষয়বস্তুগুলি হ্যাশ করতে ব্যবহার করার পদ্ধতির একটি পরিপূরক আপডেট হিসাবে লক্ষ্য করা যেতে পারে, কারণ কিছুদিন আগে ওয়ারেন ইয়ং এবং গিলসের দুর্দান্ত উত্তরে এটি (অন্যান্য জিনিসের মধ্যে) প্রস্তাব করা হয়েছিল ।
তারপরে কমপক্ষে ওপেনসুএসই (এটি প্রকাশের পরে ১২.২) তাদের ডিফল্ট জিএনইউ টার ফর্ম্যাটটিকে "জিএনইউ টার 1.13.x ফর্ম্যাট" থেকে (সামান্য) উচ্চতর "পসিক্স 1003.1-2001 (প্যাক্স) ফর্ম্যাটে" পরিবর্তন করেছে । এছাড়াও প্রবাহিত (জিএনইউ টারের বিকাশকারীদের মধ্যে) একই মাইগ্রেশন সম্পাদন করতে তারা আলোচনা করে, উদাহরণস্বরূপ , জিএনইউ টার ম্যানুয়ালটির এই পৃষ্ঠার শেষ অনুচ্ছেদটি দেখুন :
GNU টার জন্য ডিফল্ট ফর্ম্যাট সংকলন সময়ে সংজ্ঞায়িত করা হয়। আপনি এটি চালিয়ে
tar --help
এবং এর আউটপুটের শেষ লাইনগুলি পরীক্ষা করে এটি পরীক্ষা করতে পারেন । সাধারণত, GNU টারgnu
ফর্ম্যাটতে সংরক্ষণাগার তৈরির জন্য কনফিগার করা হয় তবে ভবিষ্যতের সংস্করণটি স্যুইচ হবেposix
।
(এই পৃষ্ঠাটি জিএনইউ টারের সাথে উপলভ্য বিভিন্ন সংরক্ষণাগার ফর্ম্যাটগুলিতেও একটি দুর্দান্ত পর্যালোচনা দেয়))
আমাদের ক্ষেত্রে, যেখানে আমরা ডিরেক্টরি সামগ্রী এবং হ্যাশ ফলাফলটি ট্যারেট করি এবং নির্দিষ্ট ব্যবস্থা না নিয়ে, জিএনইউ থেকে পোসিক্স ফর্ম্যাটে পরিবর্তনের নিম্নলিখিত পরিণতি হয়:
অভিন্ন ডিরেক্টরি সামগ্রী থাকা সত্ত্বেও, ফলস্বরূপ চেকসামটি পৃথক হবে।
অভিন্ন ডিরেক্টরি বিষয়বস্তু সত্ত্বেও, ডিফল্ট প্যাক্স শিরোলেখ ব্যবহার করা হলে ফলাফলের চেকসাম রান থেকে চালানো থেকে আলাদা হবে।
দ্বিতীয়টি সত্যটি থেকে আসে যে পসিক্স (প্যাক্স) ফর্ম্যাটে বর্ধিত প্যাক্স শিরোনাম অন্তর্ভুক্ত রয়েছে যা %d/PaxHeaders.%p/%f
GNU টারে ডিফল্ট ফর্ম্যাট স্ট্রিং দ্বারা নির্ধারিত হয় । এই স্ট্রিংয়ের মধ্যে, সুনির্দিষ্টটি %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-preserve
Tar থেকে জন্য বিকল্প কল্যাণকর, যদি বাদ দেওয়া হয় কোন <paths>
একটি শুধুমাত্র পাঠযোগ্য মাউন্ট ডিভাইসে মিথ্যা। অন্যথায় আপনাকে প্রতিটি একক ফাইলের জন্য সতর্ক করা হবে যার অ্যাক্সেসের টাইমস্ট্যাম্প টার পুনরুদ্ধার করতে সক্ষম ছিল না। রাইটিং সক্ষম করার জন্য <paths>
, আমি হ্যাশ ডিরেক্টরিগুলিতে অ্যাক্সেস টাইমস্ট্যাম্পগুলি সংরক্ষণ করার জন্য, এই বিকল্পটি ব্যবহার করি।
গার্লস প্রস্তাবনায়--no-recursion
ইতিমধ্যে ব্যবহৃত তর বিকল্পটি নিজে থেকে ডিরেক্টরিগুলিতে পুনরাবৃত্তভাবে উত্থিত হওয়া থেকে এবং বাছাই করা আউটপুট থেকে যা খাওয়ানো হয় তার পরিবর্তে ফাইল পরিচালনার জন্য তারকে বাধা দেয় ।find
এবং পরিশেষে, এটি সত্য যে আমি ব্যবহার md5sum
করি না: আমি আসলে ব্যবহার করি sha256sum
।
আপনার যদি এমডি 5 প্রয়োজন হয় না, আপনি চেষ্টা করতে পারেন
find . -type f | xargs cksum | cksum
find .
পরিবর্তেfind somedir
। অনুসন্ধানের জন্য বিভিন্ন পাথ-স্পেস সরবরাহ করার সময় এইভাবে ফাইলের নামগুলি একই হয়; এটি জটিল হতে পারে :-)