Md5sum වැඩසටහන මඟින් නාමාවලි සඳහා චෙක්සම් ලබා නොදේ. උප නාමාවලිවල ගොනු ඇතුළුව ඩිරෙක්ටරියේ සමස්ත අන්තර්ගතයන් සඳහා තනි MD5 චෙක්සමයක් ලබා ගැනීමට මට අවශ්යය. එනම්, සියලුම ලිපිගොනු වලින් සාදන ලද එක් ඒකාබද්ධ චෙක්සමයක්. මෙය කිරීමට ක්රමයක් තිබේද?
Md5sum වැඩසටහන මඟින් නාමාවලි සඳහා චෙක්සම් ලබා නොදේ. උප නාමාවලිවල ගොනු ඇතුළුව ඩිරෙක්ටරියේ සමස්ත අන්තර්ගතයන් සඳහා තනි MD5 චෙක්සමයක් ලබා ගැනීමට මට අවශ්යය. එනම්, සියලුම ලිපිගොනු වලින් සාදන ලද එක් ඒකාබද්ධ චෙක්සමයක්. මෙය කිරීමට ක්රමයක් තිබේද?
Answers:
නිවැරදි මාර්ගය රඳා පවතින්නේ ඔබ අසන්නේ ඇයිද යන්න මතය:
ඔබට ගසෙහි ගොනු අන්තර්ගතයේ හෑෂ් එකක් අවශ්ය නම්, මෙය උපක්රමය කරයි:
$ find -s somedir -type f -exec md5sum {} \; | md5sum
මෙය මුලින් ගොනු ලිපිගොනු සියල්ලම පුරෝකථනය කළ හැකි අනුපිළිවෙලින් සාරාංශ කරයි, පසුව එම ගොනු නම් සහ එම්ඩී 5 හැෂ් හැෂ් කළ යුතු ලැයිස්තුවක් පසුකර යන අතර ගසෙහි එක් ලිපිගොනුවක අන්තර්ගතය වෙනස් වූ විට පමණක් වෙනස් වන තනි අගයක් ලබා දෙයි.
අවාසනාවට, find -s
මැකෝස්, ෆ්රීබීඑස්ඩී, නෙට්බීඑස්ඩී සහ ඕපන්බීඑස්ඩී හි භාවිතා කරන බීඑස්ඩී සොයාගැනීම (1) සමඟ පමණක් ක්රියා කරයි. GNU හෝ SUS සොයා ගැනීම (1) සහිත පද්ධතියක සැසඳිය හැකි යමක් ලබා ගැනීමට, ඔබට ටිකක් අවලස්සන යමක් අවශ්ය වේ:
$ find somedir -type f -exec md5sum {} \; | sort -k 2 | md5sum
find -s
ඇමතුමක් එක් කිරීමෙන් අපි BSD හි හැසිරීම අනුකරණය කර ඇත්තෙමු sort
. මෙම -k 2
පමණක් මඟින් රේඛාව අවසන් හරහා ක්ෂේත්රයේ 2 වන ගොනු නම්, තරාතිරමකම එසේ ටිකක් එය, තුළ MD5 හැෂ් කට මඟ කියනවා sort
ගේ ගණනය.
මෙම විධානයෙහි දුර්වලතාවයක් ඇත, එනම් ඔබට නව රේඛා සහිත ලිපිගොනු තිබේ නම් එය ව්යාකූල වීමට ඉඩ ඇත, මන්ද එය sort
ඇමතුමට පේළි කිහිපයක් මෙන් පෙනෙනු ඇත. මෙම find -s
නිසා ගස ඉක්මවා යාමක් ප්රභේද්යයක්, එම ගැටලුව නොමැති අතර, එම වැඩසටහන සඳහා තුළ සිදු සැකසීම, find
.
කෙසේ වෙතත්, ව්යාජ ධනාත්මක තත්ත්වයන් වළක්වා ගැනීම සඳහා වර්ග කිරීම අවශ්ය වේ: වඩාත් සුලභ යුනික්ස් / ලිනක්ස් ගොනු පද්ධති නාමාවලි ලැයිස්තු ස්ථාවර, පුරෝකථනය කළ හැකි පිළිවෙලකට පවත්වා නොගනී. ඔබ ls
සඳහා නාමාවලි අන්තර්ගතයන් නිහ ly ව වර්ග කරන සහ භාවිතා කිරීමෙන් මෙය ඔබට වැටහෙන්නේ නැත . ඇමතුම් find
යම් ආකාරයකින් එහි ප්රතිදානය තෝරා බේරා ගැනීමේ තොරව මාර්ග අනුපිළිවෙල ප්රතිදානයේ ඕනෑම දෙයක් සඳහා පාදක වු ගොනු පද්ධතිය ප්රතිලාභ ඔවුන් ගැලපෙන, ගොනු අනුපිළිවෙල ආදාන වෙනස්කම් ලෙස එය ලබා නම්, මෙම විධානය වෙනස්වූ පූරක අගය දෙන්න ඇති වනු ඇත, හේතු වනු ඇත දත්ත එක හා සමාන වුවත්.
ඉහත -k 2
GNU sort
විධානයෙහි ඇති බිට් අවශ්ය දැයි ඔබට විමසිය හැකිය . ගොනුවේ දත්තවල හැෂ් අන්තර්ගතය වෙනස් වී නොමැති තාක් කල් ගොනුවේ නමට ප්රමාණවත් ප්රොක්සියක් වන බැවින්, අපි මෙම විකල්පය අතහැර දැමුවහොත් අපට ව්යාජ ධනාත්මක ප්රති get ල නොලැබෙනු ඇත sort
. කෙසේ වෙතත්, කුඩා අවස්ථාවක් ( MD5 සමඟ 1: 2 128 ) ඇති බව වටහා ගන්න, ගොනු නාමයන් හරියටම ඇණවුම් කිරීම අර්ධ වශයෙන් අනුපිළිවෙලට නොගැලපෙන අතර එය නොමැතිව -k 2
හැෂ් ision ට්ටනයක් තිබේ නම් ලබා දිය හැකිය. කෙසේ වෙතත්, මතක තබා ගන්න, කෙසේ වෙතත්, ඔබේ යෙදුමට නොගැලපීමේ වැදගත් කාරණයක් තිබේ නම්, මෙම සමස්ත ප්රවේශයම ඔබට ප්රශ්නයක් නොවේ.
ඔබට md5sum
විධාන වෙනස් කිරීමට md5
හෝ වෙනත් හැෂ් ශ්රිතයකට අවශ්ය විය හැකිය. ඔබ වෙනත් හැෂ් ශ්රිතයක් තෝරාගෙන ඔබේ පද්ධතිය සඳහා දෙවන විධානය අවශ්ය නම්, ඔබට ඒ sort
අනුව විධානය සකස් කිරීමට අවශ්ය වනු ඇත . තවත් උගුලක් නම්, සමහර දත්ත සාරාංශ වැඩසටහන් කිසිසේත් ගොනු නාමයක් ලිවීම නොවේ, ප්රධාන උදාහරණය පැරණි යුනික්ස් sum
වැඩසටහනයි.
මෙම ක්රමය තරමක් අකාර්යක්ෂම වන අතර, md5sum
N + 1 වතාවක් ඇමතීම , එහිදී N යනු ගසෙහි ඇති ගොනු ගණන වේ, නමුත් එය හැෂිං ගොනුව සහ නාමාවලි පාර-දත්ත මඟ හැරීම සඳහා අත්යවශ්ය පිරිවැයක් වේ.
ගසක ඇති ඕනෑම දෙයක් වෙනස් වී ඇති බව ඔබට හඳුනා ගැනීමට අවශ්ය නම් , ගොනු අන්තර්ගතය පමණක් නොව, tar
නාමාවලි අන්තර්ගතය ඔබ වෙනුවෙන් ඇසුරුම් කිරීමට අසන්න, ඉන්පසු එය වෙත එවන්න md5sum
:
$ tar -cf - somedir | md5sum
tar
ගොනු අවසරයන්, හිමිකාරිත්වය යනාදිය ද දකින හෙයින් , මෙය ගොනු අන්තර්ගතයන්හි වෙනස්කම් පමණක් නොව, එම දේවල වෙනස්කම් ද හඳුනා ගනී.
මෙම ක්රමය සැලකිය යුතු වේගයකින් යුක්ත වන අතර, එය ගස හරහා එක් පාස් එකක් පමණක් කර හැෂ් වැඩසටහන ක්රියාත්මක කරන්නේ එක් වරක් පමණි.
සමග මෙන් ම find
ඉහත මත පදනම් වූ ක්රමයක්, tar
යටින් පවතින ගොනු පද්ධතිය ප්රතිලාභ ඔවුන්ට සඳහා ගොනු නම් කටයුතු කිරීමට යන්නේ. ඔබගේ යෙදුමේදී, මෙය සිදු නොවන බවට ඔබට සහතික විය හැකිය. අවම වශයෙන් වෙනස් භාවිත රටා තුනක් ගැන මට සිතිය හැකිය. (මම ඒවා ලැයිස්තුගත නොකරමි, මන්ද අප නිශ්චිත නොවන හැසිරීම් ප්රදේශයකට පිවිසෙමින් සිටිමු. සෑම ගොනු පද්ධතියක්ම මෙහෙයුම් පද්ධතියේ එක් අනුවාදයක සිට තවත් අනුවාදයක් දක්වා වෙනස් විය හැකිය.)
ඔබ ව්යාජ ධනාත්මක බවක් ලබා ගන්නේ නම්, ගිලෙස්ගේ පිළිතුරේ ඇති find | cpio
විකල්පය සමඟ යාමට මම නිර්දේශ කරමි .
find somedir -type f -exec sh -c "openssl dgst -sha1 -binary {} | xxd -p" \; | sort | openssl dgst -sha1
සියලුම ගොනු නාම නොසලකා හැරීම (නව
චෙක්සම් යනු ලිපිගොනු නූලක් ලෙස නිශ්චිත හා සැක සහිත නිරූපණයකි. නිර්ණායක යනු ඔබ එකම ලිපිගොනු එකම ස්ථානයක තැබුවහොත් ඔබට එකම ප්රති .ලය ලැබෙනු ඇති බවයි. සැක සහිත අර්ථය නම් විවිධ ගොනු කට්ටල දෙකකට විවිධ නිරූපණයන් ඇති බවයි.
ලිපිගොනු අඩංගු ලේඛනාගාරයක් සෑදීම හොඳ ආරම්භයකි. මෙය නිසැක නිරූපණයකි (පැහැදිලිවම, ලේඛනාගාරය උපුටා ගැනීමෙන් ඔබට ගොනු නැවත ලබා ගත හැකි බැවින්). දිනයන් සහ හිමිකාරිත්වය වැනි ගොනු පාර-දත්ත එයට ඇතුළත් විය හැකිය. කෙසේ වෙතත්, මෙය තවම නිවැරදි නැත: සංරක්ෂිතයක් අපැහැදිලි ය, මන්ද එහි නිරූපණය ගොනු ගබඩා කර ඇති අනුපිළිවෙල මත රඳා පවතින අතර සම්පීඩනයට අදාළ නම්.
විසඳුමක් වන්නේ ගොනු නාම සංරක්ෂණය කිරීමට පෙර ඒවා වර්ග කිරීමයි. ඔබගේ ලිපිගොනු නාමවල නව රේඛා අඩංගු නොවේ නම්, ඔබට ඒවා find | sort
ලැයිස්තු ගත කිරීමට දුව ගොස් මෙම අනුපිළිවෙලෙහි සංරක්ෂිතයට එක් කරන්න. නාමාවලි වලට නැවත නොයන ලෙස ලේඛනාගාරයට පැවසීමට සැලකිලිමත් වන්න. POSIX pax
, GNU tar සහ cpio සමඟ උදාහරණ මෙන්න :
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 භාවිතා කිරීම ගැන සලකා බලන්න.
ඉහත කේතයේ ප්රභේදයක් වන්නේ ගොනු නාමයන් ශුන්ය බයිට් සමඟ වෙන් කිරීම සඳහා ග්නූ මෙවලම් මත රඳා පවතී. මෙමඟින් ගොනු නාමවල නව රේඛා අඩංගු වේ. GNU ඩයිජෙස්ට් උපයෝගිතා ඒවායේ ප්රතිදානයේ විශේෂ අක්ෂර උපුටා දක්වයි, එබැවින් නොපැහැදිලි නව රේඛා නොමැත.
{ 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 පෙරනිමියෙන් stdin / out භාවිතා කරන්නේ නැද්ද? GNU cpio 2.12 නිෂ්පාදනය කරයිcpio: Too many arguments
Md5deep දෙස බලන්න . ඔබට උනන්දුවක් දැක්විය හැකි md5deep හි සමහර විශේෂාංග:
පුනරාවර්තන ක්රියාකාරිත්වය - md5deep හට සම්පූර්ණ ඩිරෙක්ටරි ගසක්ම පුනරාවර්තනය කිරීමට හැකියාව ඇත. එනම්, නාමාවලියක ඇති සෑම ගොනුවක් සඳහාම සහ සෑම උප බහලුමකම ඇති සෑම ගොනුවක් සඳහාම MD5 ගණනය කරන්න.
සංසන්දනාත්මක මාදිලිය - md5deep හට දන්නා හැෂ් ලැයිස්තුවක් පිළිගෙන ඒවා ආදාන ගොනු සමූහයකට සංසන්දනය කළ හැකිය. දන්නා හැෂ් ලැයිස්තුවට ගැලපෙන ආදාන ගොනු හෝ නොගැලපෙන ගොනු වැඩසටහනට පෙන්විය හැකිය.
...
.../foo: Is a directory
, ලබා දෙන්නේ කුමක්ද?
md5deep -r -l -j0 . | md5sum
( -r
පුනරාවර්තන තැනක , -l
"සාපේක්ෂ මාර්ග භාවිතා කරන්න" යන්නෙන් ඩිරෙක්ටරි දෙකක අන්තර්ගතය සංසන්දනය කිරීමට උත්සාහ කරන විට ලිපිගොනු වල නිරපේක්ෂ මාර්ගය -j0
බාධා නොවන පරිදි අර්ථ දක්වයි. තනි ඇණවුම් md5sums වෙත විවිධ ඇණවුම් වලින් ආපසු ලබා දෙනු ලැබේ).
ඔබේ ඉලක්කය නාමාවලි දෙකක් අතර වෙනස්කම් සොයා ගැනීම පමණක් නම්, වෙනස භාවිතා කිරීම සලකා බලන්න.
මේක උත්සාහ කරන්න:
diff -qr dir1 dir2
ඔබට සෑම ගොනුවක්ම පුනරාවර්තව හෑෂ් කළ හැකි අතර පසුව ලැබෙන පෙළ හෑෂ් කරන්න:
> md5deep -r -l . | sort | md5sum
d43417958e47758c6405b5098f151074 *-
md5deep අවශ්යයි.
md5deep
භාවිතා කිරීම වෙනුවට hashdeep
.
## Invoked from: /home/myuser/dev/
ඔබේ වර්තමාන මාර්ගය සහ සමහර ශීර්ෂයන් ද ප්රතිදානය ## $ hashdeep -s -r -l ~/folder/
කරයි. මෙය වර්ග කිරීමට සිදු වේ, එබැවින් ඔබ ඔබගේ වර්තමාන ෆෝල්ඩරය හෝ විධාන රේඛාව වෙනස් කළහොත් අවසාන හැෂ් වෙනස් වේ.
විසඳුම :
$ pip install checksumdir
$ checksumdir -a md5 assets/js
981ac0bc890de594a9f2f40e00f13872
$ checksumdir -a sha1 assets/js
88cd20f115e31a1e1ae381f7291d0c8cd3b92fad
වැඩ වේගවත් හා පහසු විසඳුමක් පසුව අත්ගුණය.
මෙම විශිෂ්ට පිළිතුරේ පසු විපරමක් ලෙස, විශාල නාමාවලියක් සඳහා චෙක්සම් ගණනය කිරීම වේගවත් කිරීමට ඔබට අවශ්ය නම්, GNU සමාන්තරව උත්සාහ කරන්න :
find -s somedir -type f | parallel -k -n 100 md5 {} | md5
(මෙය මැක් සමඟ භාවිතා කරයි md5
, අවශ්ය පරිදි ප්රතිස්ථාපනය කරන්න.)
මෙම -k
ධජය බවට උපදෙස් බව, වැදගත් parallel
වෙනත් ආකාරයකින් සමස්ත මුදලක් ගොනු සියල්ල එම පවා, ක්රියාත්මක කිරීමට ලකුණු වෙනස් කළ හැකිය, සාමය ආරක්ෂා කිරීම සඳහා. තර්ක 100 ක් සමඟ -n 100
එක් එක් අවස්ථාව ධාවනය කිරීමට පවසයි md5
, මෙය ඔබට හොඳම ධාවන කාලය සඳහා වෙනස් කළ හැකි පරාමිතියකි. (මගේ පෞද්ගලික නඩුවේ දෝෂයක් ඇති වුවද) -X
ධජය ද බලන්න parallel
.
මම මෙය මගේ ස්නිපටය මධ්යස්ථ පරිමාවන් සඳහා භාවිතා කරමි :
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.
විවිධ නාමාවලිවල අන්තර්ගතය පවතින බැවින් ගොනු නාම පමණක් පරීක්ෂා කරන අනුවාදයක් මට අවශ්ය විය.
මෙම අනුවාදය (වොරන් යන්ග්ගේ පිළිතුර) බොහෝ සෙයින් උපකාරී විය, නමුත් මගේ අනුවාදය md5sum
ගොනු නාමය ප්රතිදානය කරයි (මම විධානය ක්රියාත්මක කළ මාර්ගයට සාපේක්ෂව), සහ ෆෝල්ඩරයේ නම් වෙනස් විය, එබැවින් තනි ගොනු චෙක්සම් ගැලපුණද, අවසාන චෙක්සමය සිදු නොවීය. 'ටී.
එය නිවැරදි කිරීම සඳහා, මගේ නඩුවේදී, find
ප්රතිදානයේ සෑම පේළියකින්ම ගොනු නාමය ඉවත් කිරීමට මට අවශ්ය විය (භාවිතා කරමින් අවකාශයන් වෙන් කර ඇති පළමු වචනය පමණක් තෝරන්න cut
):
find -s somedir -type f -exec md5sum {} \; | cut -d" " -f1 | md5sum
nix-hash
සිට මෙම Nix ඇසුරුම් කළමනාකරු
නික්ස්-හෑෂ් විධානය මඟින් එක් එක් මාර්ගයේ අන්තර්ගතයේ ගුප්ත ලේඛන හැෂ් ගණනය කර සම්මත ප්රතිදානය මත මුද්රණය කරයි. පෙරනිමියෙන්, එය MD5 හෑෂ් ගණනය කරයි, නමුත් වෙනත් හැෂ් ඇල්ගොරිතමද ඇත. හැෂ් හෙක්සැඩිසිමල් වලින් මුද්රණය කර ඇත.
සෑම මාර්ගයකම අනුක්රමිකකරණය හරහා හැෂ් ගණනය කරනු ලැබේ: මාර්ග පද්ධතියේ මුල් බැස ඇති ගොනු පද්ධති ගසෙහි ඩම්ප් එකක්. මෙය නාමාවලි සහ සිම්ලින්ක් මෙන්ම සාමාන්ය ලිපිගොනු සේදීමට ඉඩ දෙයි. ඩම්ප් එක නික්ස්-ස්ටෝර් - ඩම්ප් විසින් නිපදවන NAR ආකෘතියෙන් ඇත. මේ අනුව, නික්ස්-හැෂ් මාර්ගය නික්ස්-ස්ටෝර් - ඩම්ප් පථයට සමාන ගුප්ත ලේඛන හැෂ් ලබා දෙයි md5sum.
හොඳ ගස් පිරික්සුම් එකතුවක් යනු Git හි ගස් හැඳුනුම්පතයි.
අවාසනාවකට එය කළ හැකි තනි මෙවලමක් නොමැත (අවම වශයෙන් මම එය නොදනිමි), නමුත් ඔබට Git පහසු නම් ඔබට නව ගබඩාවක් සැකසීමට මවා පාමින් ඔබට දර්ශකයට පරීක්ෂා කිරීමට අවශ්ය ලිපිගොනු එක් කළ හැකිය.
(ප්රජනනය කළ හැකි) ගස් හැෂ් නිෂ්පාදනය කිරීමට මෙය ඔබට ඉඩ සලසයි - එයට අන්තර්ගතය, ගොනු නම් සහ අඩු කරන ලද ගොනු මාතයන් (ක්රියාත්මක කළ හැකි) පමණක් ඇතුළත් වේ.
ස්ක්රිප්ට් එකක් හොඳින් පරීක්ෂා කර ඇති අතර අනුපිටපත් සොයා ගැනීම, දත්ත සහ පාර-දත්ත යන දෙකම සංසන්දනය කිරීම, එකතු කිරීම් මෙන්ම වෙනස්කම් සහ ඉවත් කිරීම් ඇතුළු මෙහෙයුම් ගණනාවකට සහාය දක්වයි, ඔබ ඇඟිලි සලකුණු වලට කැමති විය හැකිය .
ඇඟිලි සලකුණු දැන් ඩිරෙක්ටරියක් සඳහා එක චෙක්සමයක් නිපදවන්නේ නැත, නමුත් එම නාමාවලියෙහි ඇති සියලුම ලිපිගොනු සඳහා චෙක්සම් ඇතුළත් වන පිටපත් ගොනුවක්.
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'
ඔබට md5 අවශ්ය නොවේ නම්, ඔබට උත්සාහ කළ හැකිය
find . -type f | xargs cksum | cksum
මෙම පිළිතුර මීට ටික කලකට පෙර වොරන් යන්ග් සහ ගිලෙස්ගේ විශිෂ්ට පිළිතුරු වලින් යෝජනා කරන ලද පරිදි (වෙනත් දේ අතර) නාමාවලි වල අන්තර්ගතය හෑෂ් කිරීම සඳහා තාර ප්රතිදානය භාවිතා කිරීමේ ප්රවේශයට අතිරේක යාවත්කාලීන කිරීමකි .
එතැන් සිට, අවම වශයෙන් openSUSE (නිකුත් කළ 12.2 සිට) ඔවුන්ගේ පෙරනිමි GNU Tar ආකෘතිය "GNU tar 1.13.x ආකෘතියෙන්" (තරමක්) උසස් "POSIX 1003.1-2001 (pax) ආකෘතිය" ලෙස වෙනස් කළේය. ද (GNU තාර වන සංවර්ධකයින් අතර) උඩුගං ඔවුන් උදාහරණයක් ලෙස පසුගිය ඡේදය බලන්න, එම සංක්රමණය ඉටු කිරීමට සාකච්ඡා මෙම පිටුව පිළිබඳ GNU තාර අත්පොත :
GNU තාර සඳහා පෙරනිමි ආකෘතිය සම්පාදනය කරන වේලාවේදී අර්ථ දක්වා ඇත. ධාවනය
tar --help
කිරීමෙන් සහ එහි ප්රතිදානයේ අවසාන පේළි පරීක්ෂා කිරීමෙන් ඔබට එය පරීක්ෂා කළ හැකිය . සාමාන්යයෙන්, ග්නූ තාර වින්යාසගත කර ඇත්තේ ලේඛනාගාරයgnu
ආකෘතියෙන් නිර්මාණය කිරීමට ය , කෙසේ වෙතත්, අනාගත අනුවාදය වෙත මාරු වේposix
.
(මෙම පිටුව ග්නූ තාර සමඟ ඇති විවිධ සංරක්ෂිත ආකෘතීන් පිළිබඳ කදිම සමාලෝචනයක් ද ලබා දෙයි.)
අපගේ නඩුවේදී, අපි නාමාවලි අන්තර්ගතය තාර කොට ප්රති result ලය හෑෂ් කරන අතර නිශ්චිත පියවර නොගෙන GNU සිට POSIX ආකෘතියට වෙනස් කිරීම පහත ප්රතිවිපාක ඇත:
සමාන නාමාවලි අන්තර්ගතයන් තිබියදීත්, එහි ප්රති ing ලයක් ලෙස චෙක්සම් වෙනස් වේ.
සමාන ඩිරෙක්ටරි අන්තර්ගතයන් තිබියදීත්, පෙරනිමි පැක්ස් ශීර්ෂයන් භාවිතා කරන්නේ නම් එහි ප්රති check ලයක් ලෙස ලැබෙන චෙක්සම් ධාවනය සිට ධාවනය දක්වා වෙනස් වේ.
දෙවැන්න පැමිණෙන්නේ, පොසික්ස් (පැක්ස්) ආකෘතියට දීර් extended කරන ලද පැක්ස් ශීර්ෂයන් ඇතුළත් වන අතර ඒවා %d/PaxHeaders.%p/%f
ග්නූ තාරයට පෙරනිමියෙන් හැඩ ගැසෙන ආකෘතියක් මගින් තීරණය වේ. මෙම නූල තුළ, පිරිවිතරය %p
ජනනය කරන තාර ක්රියාවලියේ ක්රියාවලි හැඳුනුම්පත මගින් ප්රතිස්ථාපනය වේ, ඇත්ත වශයෙන්ම ධාවනයෙන් ධාවනය දක්වා වෙනස් වේ. විස්තර සඳහා ග්නූ තාර අත්පොතේ මෙම කොටස සහ විශේෂයෙන් මෙය බලන්න.
දැන්, 2019-03-28 සිට ආලය, යම් කෙනෙක් සිදු මෙම ප්රශ්නය එක්සත්කමටද දායක බව පිළිගත් උඩුගං.
එබැවින්, දී ඇති භාවිත අවස්ථාවෙහිදී ග්නූ තාර භාවිතා කිරීම දිගටම කරගෙන යාමට මට පහත විකල්ප විකල්ප නිර්දේශ කළ හැකිය:
--format=gnu
"පැරණි" ආකෘතියෙන් සංරක්ෂිතය ජනනය කිරීමට තාරට පැහැදිලිවම පැවසීමට තාර විකල්පය භාවිතා කරන්න . "පැරණි" චෙක්සම් වලංගු කිරීම සඳහා මෙය අනිවාර්ය වේ.
නවතම POSIX ආකෘතිය භාවිතා කරන්න, නමුත් සුදුසු පැක්ස් ශීර්ෂයක් පැහැදිලිව සඳහන් කරන්න, උදාහරණයක් ලෙස --pax-option="exthdr.name=%d/PaxHeaders/%f"
. කෙසේ වෙතත්, මෙය "පැරණි" චෙක්සම් වලට පසුගාමී අනුකූලතාව බිඳ දමයි.
පාර-දත්ත ඇතුළු නාමාවලි අන්තර්ගතයන්හි චෙක්සම් ගණනය කිරීම සඳහා මම නිතිපතා භාවිතා කරන Bash කේත කැබැල්ලක් මෙන්න:
( 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
GNU තාර සංරක්ෂිත නොවන සොකට් කරන්නේ: අඩි, ගොනු වල ඩිරෙක්ටරි අඩංගුව කොටසක් නම් සිදුවන තාර අනතුරු ඇඟවීම් වැළකේ. මඟ හැරුණු සොකට් ගැන දැනුම් දීමට ඔබ කැමති නම්, එම ප්රකාශය අතහැර දමන්න.
--numeric-owner
සියලුම ගොනු හිමිකරුවන් නොදන්නා පද්ධතිවල පවා පසුව චෙක්සම් සත්යාපනය කිරීමට මම තාර සමඟ භාවිතා කරමි .
කියවීමට පමණක් සවි කර ඇති උපාංගයක --atime-preserve
කිසියම් <paths>
බොරුවක් තිබේ නම් තාර සඳහා ඇති විකල්පය වඩා හොඳින් මඟ හැරී ඇත. එසේ නොමැතිනම් තාර නැවත පිහිටුවීමට නොහැකි වූ එක් එක් ගොනුවක් සඳහා ඔබට අනතුරු අඟවනු ලැබේ. ලිවීම සක්රීය කිරීම සඳහා <paths>
, මම මෙම විකල්පය භාවිතා කරමි, හැෂ් ඩිරෙක්ටරිවල ප්රවේශ කාලරාමු ආරක්ෂා කර ගැනීමට.
ගිලස් යෝජනාවේ--no-recursion
දැනටමත් භාවිතා කර ඇති තාර විකල්පය , තාර නැවත නැවත නාමාවලි වලට බැසීම වළක්වන අතර, ඒ වෙනුවට වර්ගීකරණය කළ නිමැවුමෙන් පෝෂණය වන ඕනෑම දෙයක් ගොනුව මගින් ගොනු කිරීම ක්රියාත්මක කරයි.find
අවසාන වශයෙන්, මම භාවිතා කරන බව සත්යයක් නොවේ md5sum
: මම ඇත්ත වශයෙන්ම භාවිතා කරමි sha256sum
.
නාමාවලි අන්තර්ගතය / ගුණාංග වෙනස් වී ඇත්දැයි තීරණය කිරීමට මම පහත ප්රවේශය භාවිතා කරමි:
cd /path/to/dir; ls -lnAR --time-style=+%s . | md5sum
දීර් extended කරන ලද ගුණාංගවල වෙනස්කම් නිරීක්ෂණය කිරීමට ඔබට අවශ්ය නම්:
cd /path/to/dir; (ls -lnAR --time-style=+%s .; getfacl -Rns .) | md5sum
සාමාන්ය තත්වයන් යටතේ ලිපිගොනු වල අන්තර්ගතය පරීක්ෂා කිරීම අවශ්ය නොවේ. මන්දයත් ගොනු වෙනස් කිරීමේ කාලය දැනටමත් ගොනු අන්තර්ගතයේ වෙනසක් පෙන්නුම් කරන බැවිනි. මෙය සමස්ත මෙහෙයුම වේගවත් කරයි.
සටහන්:
ඔබට තවමත් ලිපිගොනු අන්තර්ගතය පරීක්ෂා කිරීමට අවශ්ය නම්: tar c -C /path/to/dir | md5sum
හෝ දීර් extended ගුණාංග සමඟ:cd /path/to/dir; (tar c .; getfacl -Rns .) | md5sum
පුළුල් පරාසයක පද්ධතිවල එය ක්රියාත්මක කිරීම සඳහා මට පෙදෙසක් සැකසීමට සිදු වූ අතර දෘ l සබැඳි ගණනය කිරීම් සහ නාමාවලි ප්රමාණයන් ls ප්රතිදානයෙන් awk සමඟ පෙරීමට සිදු විය:
cd /path;LC_ALL=C ls -lnAR --time-style=+%s .|awk '{$2=0;$1~/^d/&&$5=0;print}'|md5sum
එක් ලයිනර්:
find directory -exec md5sum {} \; 2>&1 | sort -k 2 | md5sum
මෙය සියලුම ලිපිගොනු සහ නාමාවලි ලැයිස්තුගත md5sum
කර එක් එක් සඳහා ලබා ගනී . එවිට md5sum
සෑම දෙයක්ම ලබා ගනී .
md5sum
ඩිරෙක්ටරියක් සඳහා මුදල කළ නොහැකි ට්රික්කි බිට් මෙහි විසඳා ඇත , නමුත් එය අපට මෙය කියයි : md5sum: dir/sub_dir: Is a directory
. අපි මෙම පණිවිඩය සම්මත ප්රතිදානයකට ගෙන යන්නෙමු.
find .
ඒ වෙනුවට භාවිතා කිරීම වඩාත් සුදුසු යැයි මම සිතමිfind somedir
. සොයා ගැනීමට විවිධ මාර්ග-පිරිවිතර සපයන විට ගොනු නාම සමාන වේ; මෙය ව්යාකූල විය හැකිය :-)