লিনাক্স: প্রদত্ত ফোল্ডার ও বিষয়বস্তুগুলির জন্য একটি একক হ্যাশ গণনা করুন?


98

অবশ্যই এটি সহজেই করার উপায় আছে!

আমি লিনাক্স কমান্ড-লাইন অ্যাপ্লিকেশনগুলি চেষ্টা করেছি যেমন sha1sumএবং md5sumতবে তারা কেবল পৃথক ফাইলের হ্যাশগুলি গণনা করতে সক্ষম হয় এবং প্রতিটি ফাইলের জন্য একটি করে হ্যাশ মানগুলির একটি তালিকা আউটপুট করতে সক্ষম হয় বলে মনে হয়।

আমার কোনও ফোল্ডারের পুরো বিষয়বস্তুর জন্য একটিমাত্র হ্যাশ তৈরি করতে হবে (কেবলমাত্র ফাইলের নাম নয়)।

আমি ভালো কিছু করতে চাই

sha1sum /folder/of/stuff > singlehashvalue

সম্পাদনা: পরিষ্কার করার জন্য, আমার ফাইলগুলি একটি ডিরেক্টরি ট্রিতে একাধিক স্তরে রয়েছে, তারা সবাই একই মূল ফোল্ডারে বসে নেই।


4
'সম্পূর্ণ বিষয়বস্তু' দ্বারা আপনি কী রুট হ্যাশ পৌঁছানোর সময় ডিরেক্টরিটির সমস্ত ফাইলের লজিকাল ডেটা বা মেটা সহ এটির ডেটা বোঝাতে চান? যেহেতু আপনার ব্যবহারের ক্ষেত্রে নির্বাচনের মানদণ্ডটি বেশ বিস্তৃত, তাই আমি আমার উত্তরে কয়েকটি ব্যবহারিককে সম্বোধন করার চেষ্টা করেছি।
ছয়-কে

উত্তর:


124

একটি সম্ভাব্য উপায় হ'ল:

sha1sum পাথ / থেকে / ফোল্ডার / * | sha1sum

যদি একটি সম্পূর্ণ ডিরেক্টরি গাছ থাকে তবে আপনি সম্ভবত অনুসন্ধান এবং জার্গস ব্যবহার করে আরও ভাল। একটি সম্ভাব্য কমান্ড হবে

পাথ / থেকে / ফোল্ডার-টাইপ এফ-প্রিন্ট0 | সাজানো -z | xargs -0 sha1sum | sha1sum

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

(find path/to/folder -type f -print0  | sort -z | xargs -0 sha1sum;
 find path/to/folder \( -type f -o -type d \) -print0 | sort -z | \
   xargs -0 stat -c '%n %a') \
| sha1sum

যুক্তিগুলির statকারণে এটি ফাইলটির নাম মুদ্রণ করে এবং এর অষ্টাল অনুমতিগুলি অনুসরণ করে। দুটি সন্ধান একের পর এক চলবে, যার ফলে ডিস্ক আইও দ্বিগুণ হবে, প্রথমটি সমস্ত ফাইলের নাম খুঁজে বের করবে এবং বিষয়বস্তুগুলি পরীক্ষা করবে, দ্বিতীয়টি সমস্ত ফাইল এবং ডিরেক্টরি নাম, মুদ্রণের নাম এবং মোড সন্ধান করবে। "ফাইলের নাম এবং চেকসাম" এর তালিকা এবং তার পরে "অনুমতি সহ নাম এবং ডিরেক্টরিগুলি" এর পরে একটি ছোট চেকসামের জন্য চেকসাম করা হবে।


4
এবং LC_ALL = POSIX সেট করতে ভুলবেন না, যাতে বিভিন্ন সরঞ্জাম লোকেল স্বাধীন আউটপুট তৈরি করে।
ডেভিড স্মিট

4
আমি বিড়াল পেয়েছি | sha1sum sha1sum তুলনায় যথেষ্ট দ্রুত হতে হবে | sha1sum। ওয়াইএমএমভি, আপনার সিস্টেমে এগুলির প্রতিটি ব্যবহার করে দেখুন: সময় সন্ধানের পথ / থেকে / ফোল্ডার-টাইপ এফ-প্রিন্ট0 | সাজানো -z | xargs -0 sha1sum | sha1sum; সময় সন্ধানের পথ / to / ফোল্ডার-টাইপ এফ-প্রিন্ট0 | সাজানো -z | xargs -0 বিড়াল | sha1sum
ব্রুনো ব্রোনোস্কি

4
@ রিচার্ড ব্রোনোস্কি - আসুন আমরা ধরে নিই যে আমাদের দুটি ফাইল রয়েছে, এ এবং বি এ "ফু" রয়েছে এবং বিতে "বার এখানে ছিল" রয়েছে। আপনার পদ্ধতির সাহায্যে আমরা দুটি ফাইল সি এবং ডি থেকে আলাদা করতে পারব না, যেখানে সিতে "ফুবার" রয়েছে এবং ডি রয়েছে "ছিল এখানে"। প্রতিটি ফাইল পৃথকভাবে হ্যাশ করে এবং তারপরে সমস্ত "ফাইলের নাম হ্যাশ" জোড়া হ্যাশ করে আমরা পার্থক্যটি দেখতে পারি।
ভ্যাটাইন

4
ডিরেক্টরিটি নির্বিশেষে এই কাজটি করার জন্য (যেমন আপনি যখন দুটি পৃথক ফোল্ডারের হ্যাশ তুলনা করতে চান), আপনাকে একটি আপেক্ষিক পথ ব্যবহার করতে হবে এবং উপযুক্ত ডিরেক্টরিতে পরিবর্তন করতে হবে, কারণ পাথগুলি চূড়ান্ত find ./folder -type f -print0 | sort -z | xargs -0 sha1sum | sha1sum
হ্যাশটিতে

4
@robbles যে সঠিক এবং কেন আমি ইনিশিয়াল রাখো নি /উপর path/to/folderবিট।
ভ্যাটাইন

26
  • মত একটি ফাইল সিস্টেম অনধিকারপ্রবেশ সনাক্তকরণ টুল ব্যবহার করুন সহায়তাকারী

  • ডিরেক্টরিটির একটি টার বল হ্যাশ:

    tar cvf - /path/to/folder | sha1sum

  • ভ্যাটিনের অনলাইনারের মতো নিজেকে কিছু কোড করুন :

    find /path/to/folder -type f -print0 | sort -z | xargs -0 sha1sum | sha1sum


4
টার সমাধানের জন্য +1 1 এটি সবচেয়ে দ্রুত, তবে ভি। ভার্বোসিটি কেবল এটিকে কমিয়ে দেয়।
ব্রুনো ব্রোনোস্কি

7
মনে রাখবেন যে টার সলিউশন ধরে নিয়েছে আপনি যখন ফাইলগুলি তুলনা করেন তখন ফাইলগুলি একই ক্রমে থাকে। সেগুলি তুলনা করার সময় ফাইলগুলির মধ্যে থাকা ফাইল সিস্টেমের উপর নির্ভর করে কিনা।
সংখ্যা

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

4
@ জোলতান গিট হ্যাশটি পুরোপুরি ঠিক আছে, যদি আপনি কোনও ট্রি হ্যাশ ব্যবহার করেন এবং প্রতিশ্রুতিবদ্ধ হ্যাশ না করেন।
হাবস

4
@ হোবস উত্তরটি মূলত "কমিট হ্যাশ" বলে উল্লেখ করেছে যা অবশ্যই এই উদ্দেশ্যে উপযুক্ত নয়। গাছের হ্যাশটি আরও ভাল প্রার্থীর মতো শোনাচ্ছে তবে এর পরেও লুকানো জাল থাকতে পারে। আমার মনে আসার একটিটি হ'ল কিছু ফাইলের মধ্যে এক্সিকিউটেবল বিট সেট রাখার ফলে গাছের হ্যাশ পরিবর্তন হয়। git config --local core.fileMode falseএটি এড়াতে প্রতিশ্রুতি দেওয়ার আগে আপনাকে ইস্যু করতে হবে। আমি জানি না এর মতো আর কোনও সতর্কতা আছে কি না।
জুলটান

14

আপনি করতে পারেন tar -c /path/to/folder | sha1sum


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

4
slowdog এর বৈধ উদ্বেগ, পরন্তু ফাইল বিষয়বস্তু, অনুমতি, ইত্যাদি যত্নশীল কিন্তু পরিমার্জন সময়, আপনি যোগ করতে পারেন যদি --mtimeতাই মত বিকল্প: tar -c /path/to/folder --mtime="1970-01-01" | sha1sum
বাইনারি ফাইল

@ এস.লট যদি ডিরেক্টরি আকারটি বড় হয় তবে আমি বোঝাতে চাইছি ডিরেক্টরিটির আকার যদি এত বড় হয় তবে এটি জিপ করে এবং এতে এমডি 5 পেতে আরও বেশি সময় লাগবে
কাসুন সিয়াম্বলাপিতিয়া

13

আপনি যদি কেবল ফোল্ডারে কিছু পরিবর্তন করেছেন কিনা তা পরীক্ষা করতে চান তবে আমি এটির প্রস্তাব দিই:

ls -alR --full-time /folder/of/stuff | sha1sum

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

দয়া করে নোট করুন যে এই আদেশটি প্রতিটি ফাইলের জন্য হ্যাশ তৈরি করে না, তবে সে কারণেই এটি অনুসন্ধান ব্যবহারের চেয়ে দ্রুত হওয়া উচিত।


4
আমি নিশ্চিত নই কেন সমাধানটির সরলতা দেওয়ার কারণে এর আরও বেশি উত্সাহ নেই। কেউ কেন এটি ভাল কাজ করবে না তা ব্যাখ্যা করতে পারেন?
ডেভ সি

4
আমি মনে করি এটি আদর্শ নয় কারণ উত্পন্ন হ্যাশটি ফাইলের মালিক, তারিখ-ফর্ম্যাট সেটআপ ইত্যাদির উপর ভিত্তি করে তৈরি হবে
রাইটা

4
Ls কমান্ডটি আপনি যা চান আউটপুটে কাস্টমাইজ করা যায়। গোষ্ঠী এবং মালিককে বাদ দিতে আপনি -g-এর সাথে -l প্রতিস্থাপন করতে পারেন। এবং আপনি - টাইম-স্টাইল বিকল্পের সাহায্যে তারিখের ফর্ম্যাটটি পরিবর্তন করতে পারেন। মূলত ls ম্যান পৃষ্ঠাটি পরীক্ষা করে দেখুন এবং আপনার প্রয়োজন অনুসারে কী উপযুক্ত।
শম্পোপ

@ ডেভিসি কারণ এটি অনেকটা অকেজো। আপনি যদি ফাইলের নাম তুলনা করতে চান, কেবল তাদের সাথে সরাসরি তুলনা করুন। তারা এত বড় নয়।
নবীন

7
@ নাভিন প্রশ্ন থেকে এটি পরিষ্কার নয় যে ফাইলের বিষয়বস্তু হ্যাশ করা বা গাছের পরিবর্তন সনাক্ত করা দরকার কিনা whether প্রতিটি ক্ষেত্রে এর ব্যবহার রয়েছে। উদাহরণস্বরূপ, কার্নেল ট্রিে 45 কে ফাইলের নাম সংরক্ষণ করা একক হ্যাশের চেয়ে কম ব্যবহারিক। ls -lAgGR - block-আকার = 1 - টাইম-স্টাইল = +% s | sha1sum আমার জন্য দুর্দান্ত কাজ করে
yashma

5

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

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

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

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

এর উদাহরণ এবং ব্যবহারের একটি উদাহরণ dtreetrawl

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

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

Application Options:
  -t, --terse               Produce a terse output; parsable.
  -j, --json                Output as JSON
  -d, --delim=:             Character or string delimiter/separator for terse output(default ':')
  -l, --max-level=N         Do not traverse tree beyond N level(s)
  --hash                    Enable hashing(default is MD5).
  -c, --checksum=md5        Valid hashing algorithms: md5, sha1, sha256, sha512.
  -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
  -s, --hash-symlink        Include symbolic links' referent name while calculating the root checksum
  -e, --hash-dirent         Include hash of directory entries while calculating root checksum

মানব বান্ধব আউটপুট একটি স্নিপেট:

...
... //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

4
আপনি একটি ফোল্ডারের শক্ত এবং পরিষ্কার sha256 পাওয়ার জন্য একটি সংক্ষিপ্ত উদাহরণ দিতে পারেন, সম্ভবত উইন্ডোজ ফোল্ডারের জন্য তিনটি উপ-ডিরেক্টরি এবং সেখানে প্রতিটি ফাইলের কয়েকটি ফাইল রয়েছে?
ফেরিট

3

যদি আপনি কেবল ফাইলের নাম উপেক্ষা করে ফাইলগুলির বিষয়বস্তুগুলি হ্যাশ করতে চান তবে আপনি ব্যবহার করতে পারেন can

cat $FILES | md5sum

হ্যাশ গণনার সময় আপনার কাছে একই ক্রমে ফাইল রয়েছে তা নিশ্চিত করুন:

cat $(echo $FILES | sort) | md5sum

তবে আপনার ফাইলগুলির তালিকায় ডিরেক্টরি থাকতে পারে না।


4
ফাইলের শুরুতে একটি ফাইলের প্রান্তটি সরানো যা বর্ণানুক্রমিকভাবে অনুসরণ করে হ্যাশকে প্রভাবিত করবে না তবে হওয়া উচিত should একটি ফাইল-ডিলিমিটার বা ফাইলের দৈর্ঘ্যের হ্যাশটিতে অন্তর্ভুক্ত করা দরকার।
জেসন স্ট্যাংগ্রোম

3

এটি অর্জনের আর একটি সরঞ্জাম:

http://md5deep.sourceforge.net/

যেমন শোনাচ্ছে: এমডি 5সামের মতো তবে পুনরাবৃত্তির পাশাপাশি আরও অন্যান্য বৈশিষ্ট্য।


4
যদিও এই লিঙ্কটি প্রশ্নের উত্তর দিতে পারে, উত্তরের প্রয়োজনীয় অংশগুলি এখানে অন্তর্ভুক্ত করা এবং রেফারেন্সের জন্য লিঙ্কটি সরবরাহ করা ভাল। লিঙ্কযুক্ত পৃষ্ঠাগুলি পরিবর্তিত হলে লিঙ্ক-শুধুমাত্র উত্তরগুলি অবৈধ হতে পারে।
মামুন বেনহেজাল

3

এটি যদি গিট রেপো হয় এবং আপনি যে কোনও ফাইল উপেক্ষা .gitignoreকরতে চান তবে আপনি এটি ব্যবহার করতে পারেন:

git ls-files <your_directory> | xargs sha256sum | cut -d" " -f1 | sha256sum | cut -d" " -f1

এটা আমার জন্য ভাল কাজ করছে।


অনেক ধন্যবাদ! :)
ভিজোরটেল

অনেক অ্যাপ্লিকেশন জন্য এই পদ্ধতির উচ্চতর। কেবল উত্স কোড ফাইলগুলি হ্যাশ করলে অনেক কম সময়ে পর্যাপ্ত অনন্য হ্যাশ পাওয়া যায়।
জন ম্যাকগিহি

2

এটির জন্য একটি অজগর স্ক্রিপ্ট রয়েছে:

http://code.activestate.com/recines/576973-getting-the-sha-1-or-md5-hash-of-a-directory/

যদি আপনি কোনও ফাইলের বর্ণমালা অনুসারে পরিবর্তন না করে এর নাম পরিবর্তন করেন তবে হ্যাশ স্ক্রিপ্ট এটি সনাক্ত করবে না। তবে, আপনি যদি ফাইলগুলির ক্রম বা কোনও ফাইলের বিষয়বস্তু পরিবর্তন করেন তবে স্ক্রিপ্টটি চালানো আপনাকে আগের চেয়ে আলাদা হ্যাশ দেবে।


2

ফাইল পরিবর্তনের জন্য আমাকে একটি সম্পূর্ণ ডিরেক্টরি পরীক্ষা করে দেখতে হয়েছিল।

তবে বাদ দিয়ে, টাইমস্ট্যাম্পগুলি, ডিরেক্টরিগুলির মালিকানাগুলি।

লক্ষ্য হ'ল ফাইলগুলি অভিন্ন হলে যে কোনও জায়গায় সমান পরিমাণে অভিন্ন get

অন্যান্য মেশিনে হোস্ট করা সহ, ফাইলগুলি বাদে বা তাদের মধ্যে কোনও পরিবর্তন ব্যতীত।

md5sum * | md5sum | cut -d' ' -f1

এটি ফাইলের মাধ্যমে হ্যাশের একটি তালিকা তৈরি করে, তারপরে সেই হ্যাশগুলিকে একের সাথে সংযুক্ত করে।

এটি টার পদ্ধতির তুলনায় বেশ দ্রুত।

আমাদের হ্যাশগুলিতে আরও দৃ privacy় গোপনীয়তার জন্য , আমরা একই রেসিপিটিতে sha512sum ব্যবহার করতে পারি ।

sha512sum * | sha512sum | cut -d' ' -f1

হ্যাশগুলি sha512sum ব্যবহার করে যে কোনও জায়গায় অভিন্ন হলেও এটির বিপরীত হওয়ার কোনও উপায় নেই।


ডিরেক্টরি হ্যাশ করার জন্য এটি গৃহীত উত্তরের চেয়ে অনেক সহজ বলে মনে হচ্ছে। আমি গৃহীত উত্তরটি নির্ভরযোগ্য খুঁজে পাচ্ছিলাম না। একটি ইস্যু ... হ্যাশগুলি একটি আলাদা ক্রমে বেরিয়ে আসার কি কোনও সুযোগ আছে? sha256sum /tmp/thd-agent/* | sortআমি নির্ভরযোগ্য অর্ডার দেওয়ার জন্য যা চেষ্টা করছি তা হ্যাশ করে।
ভাবনা

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

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

কি ls -r | sha256sum?
এনভিআরএম

@ এনভিআরএম এটি চেষ্টা করেছে এবং এটি কেবল ফাইলের নাম পরিবর্তনের জন্য পরীক্ষা করেছে, ফাইলের সামগ্রী নয়
Gi0rgi0s

1

এটি দুটি ধাপে তৈরি করার চেষ্টা করুন:

  1. একটি ফোল্ডারে সমস্ত ফাইলের জন্য হ্যাশ সহ একটি ফাইল তৈরি করুন
  2. এই ফাইলটি হ্যাশ করুন

তাই ভালো:

# for FILE in `find /folder/of/stuff -type f | sort`; do sha1sum $FILE >> hashes; done
# sha1sum hashes

বা এটি একবারে করুন:

# cat `find /folder/of/stuff -type f | sort` | sha1sum

for F in 'find ...' ...যখন আপনার নামে জায়গাগুলি থাকে তখন কাজ করে না (যা আপনি আজকাল সবসময় করেন)।
mivk

1

আমি পৃথক ফাইলগুলির জন্য ফলাফলগুলি পাইপ করব sort(হ্যাশ পরিবর্তন করতে কেবল ফাইলগুলির পুনরায় অর্ডারিং রোধ করতে) md5sumবা sha1sumআপনি যে কোনওটিকে বেছে নিন।


1

এটি করার জন্য আমি গ্রোভির স্ক্রিপ্ট লিখেছি:

import java.security.MessageDigest

public static String generateDigest(File file, String digest, int paddedLength){
    MessageDigest md = MessageDigest.getInstance(digest)
    md.reset()
    def files = []
    def directories = []

    if(file.isDirectory()){
        file.eachFileRecurse(){sf ->
            if(sf.isFile()){
                files.add(sf)
            }
            else{
                directories.add(file.toURI().relativize(sf.toURI()).toString())
            }
        }
    }
    else if(file.isFile()){
        files.add(file)
    }

    files.sort({a, b -> return a.getAbsolutePath() <=> b.getAbsolutePath()})
    directories.sort()

    files.each(){f ->
        println file.toURI().relativize(f.toURI()).toString()
        f.withInputStream(){is ->
            byte[] buffer = new byte[8192]
            int read = 0
            while((read = is.read(buffer)) > 0){
                md.update(buffer, 0, read)
            }
        }
    }

    directories.each(){d ->
        println d
        md.update(d.getBytes())
    }

    byte[] digestBytes = md.digest()
    BigInteger bigInt = new BigInteger(1, digestBytes)
    return bigInt.toString(16).padLeft(paddedLength, '0')
}

println "\n${generateDigest(new File(args[0]), 'SHA-256', 64)}"

প্রতিটি ফাইল মুদ্রণ এড়ানোর জন্য, বার্তা ডাইজেস্ট পরিবর্তন করতে, ডিরেক্টরি হ্যাশিং ইত্যাদি গ্রহণের জন্য আপনি নিজের ব্যবহারটি কাস্টমাইজ করতে পারেন it http://www.nsrl.nist.gov/testdata/

gary-macbook:Scripts garypaduana$ groovy dirHash.groovy /Users/garypaduana/.config
.DS_Store
configstore/bower-github.yml
configstore/insight-bower.json
configstore/update-notifier-bower.json
filezilla/filezilla.xml
filezilla/layout.xml
filezilla/lockfile
filezilla/queue.sqlite3
filezilla/recentservers.xml
filezilla/sitemanager.xml
gtk-2.0/gtkfilechooser.ini
a/
configstore/
filezilla/
gtk-2.0/
lftp/
menus/
menus/applications-merged/

79de5e583734ca40ff651a3d9a54d106b52e94f1f8c2cd7133ca3bbddc0c6758

0

আপনি sha1sumহ্যাশ মানগুলির তালিকা তৈরি করতে এবং তারপরে sha1sumআবার সেই তালিকা তৈরি করতে পারেন, এটি ঠিক কী অর্জন করতে চান তার উপর নির্ভর করে।


0

পাইথন 3 এর একটি সহজ, সংক্ষিপ্ত রূপটি যা ছোট আকারের ফাইলগুলির জন্য সূক্ষ্মভাবে কাজ করে (উদাহরণস্বরূপ একটি উত্স গাছ বা এমন কিছু, যেখানে প্রতিটি ফাইল স্বতন্ত্রভাবে র‍্যামের সাথে ফিট করতে পারে), অন্যান্য সমাধানের ধারণার ভিত্তিতে খালি ডিরেক্টরিগুলি উপেক্ষা করে:

import os, hashlib

def hash_for_directory(path, hashfunc=hashlib.sha1):                                                                                            
    filenames = sorted(os.path.join(dp, fn) for dp, _, fns in os.walk(path) for fn in fns)         
    index = '\n'.join('{}={}'.format(os.path.relpath(fn, path), hashfunc(open(fn, 'rb').read()).hexdigest()) for fn in filenames)               
    return hashfunc(index.encode('utf-8')).hexdigest()                          

এটি এর মতো কাজ করে:

  1. ডিরেক্টরিটিতে সমস্ত ফাইল পুনরাবৃত্তভাবে সন্ধান করুন এবং নাম অনুসারে বাছাই করুন
  2. প্রতিটি ফাইলের হ্যাশ (ডিফল্ট: SHA-1) গণনা করুন (সম্পূর্ণ ফাইলটিকে মেমরিতে পাঠায়)
  3. "ফাইলের নাম = হ্যাশ" লাইন সহ একটি পাঠ্য সূচক তৈরি করুন
  4. সেই সূচকটিকে আবার কোনও ইউটিএফ -8 বাইট স্ট্রিংয়ে এনকোড করুন এবং হ্যাশ করুন

যদি SHA-1 আপনার চায়ের কাপ না হয় তবে আপনি দ্বিতীয় প্যারামিটার হিসাবে একটি ভিন্ন হ্যাশ ফাংশনে পাস করতে পারেন ।


0

এখনও পর্যন্ত এটি করার দ্রুততম উপায়টি এখনও টারের সাথে রয়েছে। এবং বেশ কয়েকটি অতিরিক্ত পরামিতিগুলির সাহায্যে আমরা মেটাডাটা দ্বারা সৃষ্ট পার্থক্য থেকেও মুক্তি পেতে পারি।

হ্যাশ দিরের জন্য টার ব্যবহার করতে, আপনারা নিশ্চিত করতে হবে যে আপনি টারের সময় পাথটি সাজান , অন্যথায় এটি সর্বদা আলাদা।

tar -C <root-dir> -cf - --sort=name <dir> | sha256sum

সময় উপেক্ষা করুন

আপনি যদি অ্যাক্সেসের সময় বা সময় পরিবর্তনের বিষয়ে চিন্তা না করেন তবে এ জাতীয় কিছু ব্যবহার করুন --mtime='UTC 2019-01-01' সমস্ত টাইমস্ট্যাম্প একরকম কিনা তা নিশ্চিত করার জন্য ।

মালিকানা উপেক্ষা করুন

সাধারণত আমাদের যোগ করা প্রয়োজন --group=0 --owner=0 --numeric-owner মালিকের মেটাডেটা একীকরণের করতে হবে।

কিছু ফাইল উপেক্ষা করুন

ব্যবহার --exclude=PATTERN

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