ডিরেক্টরি একটি ডিরেক্টরি জন্য sha1sum


33
sha1sum ./path/to/directory/* | sha1sum 

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

উত্তর:


14

এই এই পোস্টটি ধন্যবাদ -

find . -type f \( -exec sha1sum "$PWD"/{} \; \) | sha1sum

সতর্কতা: এই কোডটি অপরিশোধিত ! এই প্রশ্নটি ভুল হলে এটি সম্পাদনা করুন এবং আপনি এটিকে ঠিক করতে পারেন; আমি আপনার সম্পাদনা অনুমোদন করব।


দুঃখিত; আমি প্রতিহত করতে পারি না! ;-) পুনরাবৃত্তি মজাদার। অবশ্যই একটি উপায় আছে। আমি এখনই একটি সঠিক উত্তর লিখব।
allquixotic

3
এটি বিভিন্ন মেশিনে ঠিক একই ফোল্ডারগুলির জন্য একই হ্যাশ তৈরি করে না কারণ আউটপুটটিতে <hash> এবং <ফাইল পাথ> রয়েছে যা ফাইল মেশিনে বিভিন্ন মেশিনে পৃথক এবং বিভিন্ন মেশিনে বিভিন্ন হ্যাশ সৃষ্টি করে। সঠিক লাইন কেমন হওয়া উচিত find . -type f \( -exec sha1sum "$PWD"/{} \; \) | awk '{print $1}' | sort | sha1sum@allquixotic
Alper

1
এগুলি ছাড়াও, ফাইলগুলির হ্যাশগুলি ক্রমযুক্ত হওয়া উচিত যা বিভিন্ন মেশিনে বাছাই করার ক্রমটি আলাদা হলে বিভিন্ন হ্যাশও ঘটায়।
আল্পার

40

আমি সাধারণত "Find | xargs" প্যাটার্নটি পছন্দ করি, তেমন:

find ./path/to/directory/ -type f -print0  | xargs -0 sha1sum

ফাইলের নামের ক্ষেত্রে ফাঁকা থাকার ক্ষেত্রে আপনাকে "-প্রিন্ট0" এবং "-0" ব্যবহার করতে হবে।

তবে এটি "ফাইন্ড-এক্সেক সেন্টিমিটার {}" প্যাটার্নের সাথে খুব মিল।

দুটি নিদর্শনগুলির সাথে তুলনা করে এখানে একটি আলোচনা দেখুন: https://stackoverflow.com/questions/896808/find-exec-cmd-vs-xargs


আপনার উত্তরটি কেবলমাত্র ফাইলগুলির হ্যাশ দেয়। ফোল্ডারের হ্যাশ ব্যবহার করে পাওয়া উচিত find . -type f -print0 | xargs -0 sha1sum | awk '{print $1}' | sha1sum
আল্পার

5

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

সূচনা

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

find ./path/to/directory/ -type f -print0  | xargs -0 sha1sum

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

find ./path/to/directory/ -type f -print0  | xargs -0 sha1sum > sha1sum_list_unsorted.txt
sort sha1sum_list_unsorted.txt > sha1sum_list_sorted.txt

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

এবং স্ক্রিপ্টের ...

এখানে আমি লিখেছি একটি স্ক্রিপ্ট। এটি সন্ধান / xarg উত্তরটি একই জিনিসটি করে তবে এটি sha1sum পাওয়ার আগে ফাইলগুলি বাছাই করবে (তাদের একই ডিরেক্টরিতে রাখবে)। স্ক্রিপ্টের প্রথম লাইনটি ডিরেক্টরিটিতে পুনরাবৃত্তভাবে সমস্ত ফাইল সন্ধান করে। পরেরটি বর্ণমালা অনুসারে ফলাফলগুলি বাছাই করে। নিম্নলিখিত দুটি, বাছাই করা সামগ্রী গ্রহণ করে এবং সাজানো তালিকার ফাইলগুলিতে একটি শ1সাম এবং উদ্ধৃতি চিহ্ন সংযোজন করে একটি বড় শেল স্ক্রিপ্ট তৈরি করে যা প্রতিটি ফাইল হ্যাশকে একবারে গণনা করে এবং এটি Content_sha1sum.txt এ আউটপুট করে।

#!/bin/bash
find . -type f > content.txt
sort content.txt > content_sorted.txt
awk '{print "sha1sum \""$0}' content_sorted.txt > temp.txt
awk '{print $0"\""}' temp.txt > get_sha1.sh
chmod +x get_sha1.sh
./get_sha1.sh > content_sha1sum.txt
rm content.txt
rm content_sorted.txt
rm temp.txt
rm get_sha1.sh
xdg-open content_sha1sum.txt

আশাকরি এটা সাহায্য করবে.


সমস্ত ফাইলের নামের মোট দৈর্ঘ্য কমান্ড লাইনের সাথে মানানসই হয়, sort -z( --zero-terminated) মাধ্যমে পাইপিং করা গুচ্ছ ফাইলগুলির সাথে গোলযোগের চেয়ে সহজ।
আন্তন স্যামসনভ

@ অ্যান্টনস্যামসনোভ এটি একটি সত্যই পুরানো লিপি, আমি তখন স্ক্রিপ্টিং শিখছিলাম। আমি এরপরে একে একে পুরোটা আবার লিখেছি। বাছাইয়ের সময় শূন্যের সমাপ্তি কী করে তা আপনার মন্তব্যের সাথে: আমি সাজানোর ম্যান পৃষ্ঠাটি পড়েছি। তারা বলে যে শূন্যের সমাপ্তি একটি নতুন লাইনের পরিবর্তে লাইনের শেষে একটি শূন্য বাইট আটকে আছে। কী অর্জন করে?
thebunnyrules

আমি এই স্ক্রিপ্টটির একটি পৃথক উত্তর হিসাবে এখানে একটি আপডেট পোস্ট করেছি: superuser.com/questions/458326/…
thebunnyrules

4

সূচনা

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

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

এখানে আমার নতুন স্ক্রিপ্টটি যা করে:

  1. আপনি যে ডিরেক্টরিটি হ্যাশ করতে চান এবং যে ইনপুটটি চান তা কেবল আপনি স্ক্রিপ্টটি ব্যবহার করতে পারেন:

    sha256rec

    বিকল্পভাবে, আপনি এই স্ক্রিপ্টটি অন্য ডিরেক্টরি থেকে কল করে কল করতে পারেন:

    sha256rec "/path/to/target/directory/you/want/hash"
  2. আপনার বর্তমান ডিয়ারে লেখার সুবিধা থাকলে স্ক্রিপ্ট সনাক্ত করবে। আপনি যদি করেন তবে ফলাফলগুলি বর্তমান ডিরেক্টরিতে সংরক্ষণ করা হবে। আপনার যদি লেখার অধিকার না থাকে বা যদি আপনার বর্তমান ডিরেক্টরিটি কেবল পঠনযোগ্য সিস্টেমে থাকে (যেমন সিড্রোম), ফলাফলগুলি বর্তমান ব্যবহারকারীর হোম ডিরেক্টরিতে সংরক্ষণ করা হবে।

  3. স্ক্রিপ্ট সনাক্ত করবে যে কিছু সাব ডিরেক্টরি যদি বর্তমান ব্যবহারকারীর সুবিধায় অ্যাক্সেসযোগ্য না হয়। যদি সবগুলি পাঠযোগ্য হয় তবে বিশেষাধিকারের কোনও উন্নতি ঘটে না, যদি তা না হয় তবে ব্যবহারকারীর অধিকারগুলি রুটে উন্নীত হয়।

  4. বর্তমান ডিয়ার কাঠামোর সমস্ত ফাইল (সমস্ত উপ-ডিরেক্টরি সহ) সন্ধান করার জন্য ব্যবহৃত হয়। ফলাফল বর্ণানুক্রমিকভাবে আউটপুট হয়েছে তা নিশ্চিত করতে বাছাই করা হয়। ফলাফলের তালিকাটি sha256sum এর মধ্য দিয়ে যায় এবং একটি পাঠ্য ফাইলে আউটপুট করা হয়।

  5. পুরানো স্ক্রিপ্টটি লেখার পরে আমি একটি নকশার দর্শন গ্রহণ করেছি যে টেম্প ফাইলগুলি খারাপ এবং তারা যখন ত্রুটিযুক্ত তৃতীয় পক্ষ দ্বারা স্নোপিং এবং টেম্পারিংয়ের জন্য ব্যবহারকারীদের খোলা ছেড়ে দেয় তখন সম্ভব এড়ানো উচিত। সুতরাং এই নতুন স্ক্রিপ্টের সমস্ত ডেটা ভেরিয়েবল হিসাবে খুব শেষ মুহুর্ত পর্যন্ত চালিত হয় যেখানে ফলাফল পাঠ্য ফাইল হিসাবে প্রকাশিত হয়।

  6. ফলস্বরূপ ফাইলটি নিজেই হ্যাশ হয় এবং টার্মিনালে পাথ / হ্যাশ আউটপুট হয়। আমি পরের স্কুল অফলাইনে ক্যামেরা সহ এই হ্যাশগুলির ছবি তুলতে চাই যাতে ফলাফলের ফাইলটি কোনও ছড়িয়ে পড়ে না যখন আমি পরবর্তী তারিখে উল্লেখ করি।

  7. পুরানো ফলাফল ফাইল ট্যালি উপেক্ষা করা হয়। এটি ফলাফলের তুলনা আরও সহজ করে তোলে।

আমার স্ক্রিপ্টটি চালনার সময় এখানে টার্মিনাল আউটপুটটির একটি উদাহরণ রয়েছে:

kernelcrunch@ubuntu:/usr/src/linux-headers-4.13.0-16-generic$ sha256rec
======================================================================= 
sha256rec:         
=======================================================================        
Current Folder : /usr/src/linux-headers-4.13.0-16-generic   
Target Folder  : /usr/src/linux-headers-4.13.0-16-generic
Output File    : /home/kernelcrunch/000_sha256sum_recurs_linux-headers-4.13.0-16-generic_d_22-04-2018_t_02.17.txt


Seems you're currently in either a Read-Only system or a root owned directory as a regular user. You can find the hash results in your home folder.
f3ddb06212622c375c6bcc11bd629ce38f6c48b7474054ca6f569ded4b4af9d8  /home/kernelcrunch/000_sha256sum_recurs_linux-headers-4.13.0-16-generic_d_22-04-2018_t_02.17.txt
Operation Length: 10 Seconds.
=======================================================================
kernelcrunch@ubuntu:/usr/src/linux-headers-4.13.0-16-generic$ 

এখানে আউটপুটটির একটি স্নিপেট রয়েছে যা 000_sha256sum_recurs_linux-headers-4.13.0-16-জেনেরিক_ড_22-04-2018_t_02.17.txt এ পাওয়া যাবে:

79c3f378a42bd225642220cc1e4801deb35c046475bb069a96870ad773082805  ./.9491.d
2e336c69cde866c6f01a3495048d0ebc2871dd9c4cb5d647be029e0205d15ce6  ./.config
174f23ff7a7fba897bfb7cf17e9a501bcecacf7ef0c0d5cf030414c1e257d4e3  ./.config.old
389d83f546b250304a9a01bb3072ff79f9d9e380c8a2106cadbf714a872afe33  ./.missing-syscalls.d
035dc77da819101cb9889b4e515023dddd2c953f00d2653b87c6196a6560903e  ./Module.symvers
b28054d7995233e6d003ceb9ed119a0b3354f5ccf77b8d687fc0353ae3c5bfb8  ./arch/x86/include/generated/asm/.syscalls_32.h.cmd
01cf821170e3e6e592e36a96e8628377151c762ac2ee3210c96004bfaef22f5f  ./arch/x86/include/generated/asm/.syscalls_64.h.cmd
111efa83187c58a74a9b0170fd496b497b0682d109a7c240c17e2ffcc734f4f4  ./arch/x86/include/generated/asm/.unistd_32_ia32.h.cmd
fcba4e8abf9e95472c31708555db844ac43c87260fb0ba706b6f519404bf9aba  ./arch/x86/include/generated/asm/.unistd_64_x32.h.cmd
3264438a54cbf7e62b05d38a93c5df8fe4202ac782a5d83ed202cba9eee71139  ./arch/x86/include/generated/asm/.xen-hypercalls.h.cmd
4bd7a45837da7de379b87242efe562ce06bf9d8ab8f636c205bb5ef384c8f759  ./arch/x86/include/generated/asm/clkdev.h
0d96461abd23bbf2da522822948455413a345f9ef8ac7a7f81c6126584b3c964  ./arch/x86/include/generated/asm/dma-contiguous.h
b1a54c24a12ce2c0f283661121974436cdb09ae91822497458072f5f97447c5d  ./arch/x86/include/generated/asm/early_ioremap.h
dd864107295503e102ea339e0fd4496204c697bdd5c1b1a35864dfefe504a990  ./arch/x86/include/generated/asm/mcs_spinlock.h
782ce66804d000472b3c601978fa9bd98dcf3b2750d608c684dc52dd1aa0eb7e  ./arch/x86/include/generated/asm/mm-arch-hooks.h
cd9913197f90cd06e55b19be1e02746655b5e52e388f13ec29032294c2f75897  ./arch/x86/include/generated/asm/syscalls_32.h
758ce35908e8cfeec956f57a206d8064a83a49298e47d47b7e9a7d37b5d96d59  ./arch/x86/include/generated/asm/syscalls_64.h
1147ca3a8443d9ccbdf9cd1f4b9b633f0b77f0559b83ec5e4fa594eadb2548be  ./arch/x86/include/generated/asm/unistd_32_ia32.h
ca5223fbf8f03613a6b000e20eb275d9b8081c8059bc540481a303ce722d42f3  ./arch/x86/include/generated/asm/unistd_64_x32.h
31703052c0d2ab8fe14b4e5dfcc45fcbd5feb5016b0a729b6ba92caa52b069e2  ./arch/x86/include/generated/asm/xen-hypercalls.h
c085ff1b6e9d06faa3fc6a55f69f9065c54098d206827deec7fe0a59d316fc99  ./arch/x86/include/generated/uapi/asm/.unistd_32.h.cmd
7929c16d349845cebb9e303e0ff15f67d924cac42940d0f7271584f1346635fc  ./arch/x86/include/generated/uapi/asm/.unistd_64.h.cmd
9aa492c5a75f5547f8d1dc454bef78189b8f262d1c4b00323a577907f138a63e  ./arch/x86/include/generated/uapi/asm/.unistd_x32.h.cmd
f568e151bbbb5d51fd531604a4a5ca9f17004142cd38ce019f0d5c661d32e36b  ./arch/x86/include/generated/uapi/asm/unistd_32.h
c45cf378498aa06b808bb9ccf5c3c4518e26501667f06c907a385671c60f14ae  ./arch/x86/include/generated/uapi/asm/unistd_64.h
a0088d8d86d7fd96798faa32aa427ed87743d3a0db76605b153d5124845161e2  ./arch/x86/include/generated/uapi/asm/unistd_x32.h
e757eb6420dffa6b24b7aa38ca57e6d6f0bfa7d6f3ea23bbc08789c7e31d15fa  ./arch/x86/kernel/.asm-offsets.s.cmd
f9e703e4f148d370d445c2f8c95f4a1b1ccde28c149cff2db5067c949a63d542  ./arch/x86/kernel/asm-offsets.s
7971fb3e0cc3a3564302b9a3e1ad188d2a00b653189968bbc155d42c70ce6fbf  ./arch/x86/purgatory/.entry64.o.cmd
8352d79fe81d2cf694880f428e283d79fd4b498cea5a425644da25a9641be26b  ./arch/x86/purgatory/.kexec-purgatory.c.cmd
37f3edbee777e955ba3b402098cb6c07500cf9dc7e1d44737f772ac222e6eb3e  ./arch/x86/purgatory/.purgatory.o.cmd
bb8b895cbd2611b69e2f46c2565b4c2e63a85afb56cff946a555f2d277ee99b2  ./arch/x86/purgatory/.purgatory.ro.cmd
bcc2365c9d3d027f1469806eb4f77b0f3ede6eb0855ea0fcd28aa65884046a54  ./arch/x86/purgatory/.setup-x86_64.o.cmd
872229f334fdcc8562e31b9f6581008c1571ac91f12889cd0ff413590585155a  ./arch/x86/purgatory/.sha256.o.cmd
6fb0cbef120aadee282f7bc3b5ea2f912980f16712281f8f7b65901005194422  ./arch/x86/purgatory/.stack.o.cmd
cd1b61063ae3cf45ee0c58b2c55039f3eac5f67a5154726d288b4708c4d43deb  ./arch/x86/purgatory/.string.o.cmd
e5826f0216fd590972bbc8162dd175f87f9f7140c8101505d8ca5849c850ec91  ./arch/x86/purgatory/entry64.o

(এটি এর মতো আরও 7000+ লাইনের জন্য চলে তবে আপনি ধারণাটি পাবেন)

স্থাপন

  1. একটি টার্মিনাল খুলুন এবং নিম্নলিখিত কমান্ডগুলি ইনপুট করুন:

    cd /usr/bin
    sudo su
    echo '#!/bin/bash'> /usr/bin/sha256rec
    chmod +x /usr/bin/sha256rec
    touch /usr/bin/sha256rec
    nano /usr/bin/sha256rec
  2. ন্যানোতে, পেস্ট করতে Shif + Ctrl + v ব্যবহার করুন। সংরক্ষণ করতে Ctrl-O এবং এন্টার দিন। সিটিআর-এক্স প্রস্থান করে। আমার স্ক্রিপ্টটি সেখানে আটকে দিন:

(#! / বিন / ব্যাশের পরে পেস্ট করুন)

  #FUNCTIONS OR FUNCTYOU?
  function s_readonly { err=$(date +%s%N); cd "$1"; mkdir $err 2> /tmp/$err; rmdir $err 2>/dev/null; echo $(cat /tmp/$err|grep -i "Read-only file system"|wc -l);shred -n 0 -uz /tmp/$err; }
  function w_denied { echo $(err=$(date +%s%N); cd "$1"; mkdir $err 2> /tmp/$err; rmdir $err 2>/dev/null; cat /tmp/$err|grep -i "Permission denied"|wc -l;shred -n 0 -uz /tmp/$err); }
  function r_denied { echo $(err=$(date +%s%N); cd "$1" >/dev/null 2> /tmp/$err; find . >/dev/null 2>> /tmp/$err; cat /tmp/$err|grep -i "Permission denied"|wc -l;shred -n 0 -uz /tmp/$err); }
  function rando_name { rando=$(echo $(date +%s%N)|sha256sum|awk '{print $1}'); rando=${rando::$(shuf -i 30-77 -n 1)}; echo $rando;}
  function ms0 { ms0=$(($(date +%s%N)/1000000)); }; function mstot { echo $(($(($(date +%s%N)/1000000))-$ms0));}
  function s0 { s0=$(date +%s); }; function stot { echo $(($(date +%s)-$s0));}
  s0

  #CHECK IF A TARGET DIR WAS SPECIFIED (-t= or --target= switch)
  if [ ! -z "$1" ]; then arg1="$1"; arg1_3=${arg1::3}; arg1_9=${arg1::9};fi
  if [ "$arg1_3" = "-t=" -o "$arg1_9" = "--target=" ]; then 
    switch=$(echo $arg1|awk -F '=' '{print $1}')
    switch_chr=$((${#switch}+1))
    target=${arg1:$switch_chr}
    current=$(pwd)
    cd "$target"
    arg1="" #<- cancels the not path in the find line
  else
    current=$(pwd)
    target=$(pwd) 
  fi

  echo -e  "=======================================================================\
    \nsha256rec: \
          \n=======================================================================\
          \nCurrent Folder : $current \
    \nTarget Folder  : $target"

  #GETS DEFAULT_USER, ASSUME'S YOU'RE USER 1000, IF 1000 DOESN'T EXIST SEARCHES 999, THEN 1001, 1002
  default_user=$(awk -v val=1000 -F ":" '$3==val{print $1}' /etc/passwd)
  if [ -z "$default_user" ]; then default_user=$(awk -v val=999 -F ":" '$3==val{print $1}' /etc/passwd); fi
  if [ -z "$default_user" ]; then default_user=$(awk -v val=1001 -F ":" '$3==val{print $1}' /etc/passwd); fi
  if [ -z "$default_user" ]; then default_user=$(awk -v val=1002 -F ":" '$3==val{print $1}' /etc/passwd); fi

  if [ "$(users | wc -l)" = "1" ]; then USER=$(users|awk '{print $1}'); else USER=$default_user;fi #not perfect but meh...

  #running rando_name in this very specific spot between USER detection and Permission detection, some interfers somehow with detection functions... 
  #the rando function placed underneath the user detection is somehow turning c=$current from the dir path to whatever rando_name puts out.

  #FIGURE OUT WHERE TO PUT HASH LIST
  hash_file="000_sha256sum_recurs_${target##*/}_d_$(date +%d-%m-20%y)_t_$(date +%H.%M).txt"
  if [ $(s_readonly "$current") -gt 0 -o $(w_denied "$current") -gt 0 ]; then if [ "$(whoami)" != root ]; then dest="/home/$(whoami)";echo -e "Output File    : $dest/$hash_file\n\n";echo "Seems you're currently in either a Read-Only system or a root owned directory as a regular user. You can find the hash results in your home folder."; else dest="/home/$USER";echo -e "Output File    : $dest/$hash_file\n\n";echo "Seems you're currently a Read-Only system. You can find the hash results in $USER's home folder.";fi; else dest="$current";echo -e "Output File    : $dest/$hash_file\n\n";echo "Results will be saved here.";fi



  #CAN REGULAR USER ACCESS TARGET DIR? ARE ALL IT'S SUBDIRS READABLE?
  if [ $(r_denied "$target") -gt 0 ]; then sudo=sudo; echo "Some folder were not read-able as a regular user. User elevation will be required.";fi

  #PERFORM RECURSIVE HASHING
  command=$($sudo find . -type f -not -type l -not -path "$arg1"  -not -path "$2"  -not -path "$3" -not -path "$4"  -not -path "$5"  -not -path "$6" -not -path "$7"  -not -path "$8"  -not -path "$9" |grep -v "\./000_sha"|sort|awk "{print \"$sudo sha256sum \\\"\"\$0}"|awk '{print $0"\""}'|tr '\n' ';')
  eval $command > "$dest/$hash_file"

  sha256sum "$dest/$hash_file"
  echo "Operation Length: $(stot) Seconds."
  echo -e  "======================================================================="



  if [ "$target" != "$current" ]; then cd "$current";fi


  exit
  #||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  #||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  #||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  #||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
  1. আপনি যখন ন্যানো থেকে প্রস্থান করবেন, প্রবেশের মাধ্যমে উন্নত স্থিতি থেকে বেরিয়ে আসার বিষয়ে নিশ্চিত হন:

    exit

সর্বশেষ ভাবনা

  1. আপনি কেবল ইনস্টল করা থাকলে এটি কাজ করবে। আমি স্ট্রিং ম্যানিপুলেশন জন্য কিছু সিনথ্যাক্স ব্যবহার করেছি যা sh, ড্যাশ, ksh, বা zsh এর সাথে কাজ করে না। আপনি এখনও আপনার প্রতিদিনের চালক হিসাবে অন্য যে কোনও শাঁস ব্যবহার করতে পারেন তবে বাশ ইনস্টল করা দরকার।

  2. আউটপুটযুক্ত তালিকাগুলি বিভিন্ন সরঞ্জামের সাথে তুলনা করা যেতে পারে যেমন: (টার্মিনালে) ডিফ, এসডিফ (এবং গ্রাফিকাল) বিচ্ছুরণ, কেডিফ, উইনমার্জ।

  3. আমার ফাইল পাথের উপর ভিত্তি করে আউটপুটটি সাজায়, মানুষের দ্বারা পড়া সহজ করে তুলতে। আমি লক্ষ্য করেছি যে সাজ্ট কমান্ডটি বিভিন্ন ডিস্ট্রো জুড়ে আলাদাভাবে কাজ করছে। উদাহরণস্বরূপ, একটি ডিস্ট্রোতে মূল চিঠিগুলি নন-ক্যাপগুলির চেয়ে বেশি অগ্রাধিকার নিয়েছিল এবং অন্যটিতে তারা তা করেনি। এটি আউটপুট ফাইলগুলির লাইন ক্রমকে প্রভাবিত করে এবং ফাইলগুলি তুলনা করা শক্ত করতে পারে। আপনি যদি সর্বদা একই ডিস্ট্রোতে স্ক্রিপ্টটি ব্যবহার করেন তবে এটি কোনও সমস্যা উপস্থাপন করবে না তবে হ্যাশগুলির তালিকা দুটি পৃথক পরিবেশে তৈরি করা হতে পারে। এটি অতিরিক্ত সময়ে হ্যাশ ফাইলগুলি বাছাই করে সহজেই প্রতিকার করা যায় যাতে লাইনগুলি পাথের পরিবর্তে হ্যাশ দ্বারা আদেশ করা হয়:

     cat 000_sha256sum_oldhashlist|sort> ./old
     cat 000_sha256sum_newhashlist|sort> ./new
     sha256sum ./old ./new; diff ./old ./new

আরো শক্তসমর্থ কুঁড়েঘর লাইন হবে #!/usr/bin/env bash- এটা, পাশাপাশি অন্যান্য ডিরেক্টরিগুলি থেকে ব্যাশ পাবেন পরেরটির এ ইনস্টল করা যেতে পারে কারণ , / usr / বিন বদলে / বিন , উদাহরণস্বরূপ, এদিকে env মধ্যে হতে থাকে , / usr / বিন সব সময়ে আমি যতদূর লক্ষ্য করেছি আরও লক্ষণীয় যে, আপনার যেহেতু বাশের প্রয়োজন, আপনি [[ blah-blah ]]আরও জেনেরিক [ blah-blah ]একক-বন্ধনী বৈকল্পিকের পরিবর্তে ডাবল-বন্ধনী শর্তসাপেক্ষ এক্সপ্রেশন ব্যবহার করতে পারেন ।
আন্তন স্যামসনভ

পয়েন্টার জন্য ধন্যবাদ। আমি সবেমাত্র [[শর্তসাপেক্ষে সন্ধান করা) শেষ করেছি। তারা সত্যিই দরকারী দেখায়।
thebunnyrules

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

আপনি নিজের যুক্তি নিজের বিরুদ্ধে ব্যবহার করতে পারেন। যদি আপনি সাধারণ (অ আক্রমণ সম্পর্কিত নয়) দুর্নীতির বিষয়ে উদ্বিগ্ন হন তবে sha1 নিজেই ওভারকিল। আপনি md5 / crc32 ব্যবহার করে দ্রুত ফলাফল পেতে পারেন। উভয় পরিস্থিতিতে (টেম্পার সনাক্তকরণ বা দুর্নীতি) sha1 ভাল ফিট নয়। ব্যক্তিগতভাবে, আমি উভয় পরিস্থিতিতে এই হ্যাশ তালিকাগুলি ব্যবহার করি এবং আমি sha256 এ আপগ্রেড করার পরে কোনও অনুধাবনযোগ্য পারফরম্যান্সের নজরে পড়েনি তবে আমি কোনও মেগা সার্ভারও চালাচ্ছি না। যেমন আমি উত্তরে বলেছি, আপনি আমার শ 256sum কমান্ডের পরিবর্তে আপনার যে কোনও হ্যাশ ব্যবহার করতে পারবেন আপনি চান: sha1sum, md5sum, b2sum, crc32 ...
thebunnyrules

1

এটি আমার পক্ষে কাজ করে বলে মনে হচ্ছে:

find . \( -not -name . \) -type f -exec cat {} + | sha1sum

সম্পাদনা করুন: এটি কেবল ডিরেক্টরি ট্রিতে থাকা সমস্ত ফাইলকেই কেবল শামসাম করবে। যদি কোনও ডিরেক্টরিটির নাম পরিবর্তন করা হয় তবে এটি এটি ধরবে না। হতে পারে এরকম কিছু:

find . -exec sha1sum {} + 2>&1 | sha1sum

এটা করবে। অন্য উত্তর হিসাবে যদিও একই উত্তর সম্পর্কে


1

আর একটি কৌশল হ'ল ফাইলের সামগ্রী এবং মেটাডেটা হ্যাশ করতে ব্যবহার করতে পারে:

tar -cf - ./path/to/directory | sha1sum

খুব খারাপ যে আমার কেবল একটি ভোট আছে
166_MMX

1
এটা কাজ করে না. কিছু কিছু OS (যেমন OSX) এর টাইমস্ট্যাম্প অন্তর্ভুক্ত করে এবং sha1sum প্রতিটি রান আলাদা হবে।
srossross

@ সরসক্রস যা বলেছে। এছাড়াও, দুটি হোস্টে আপনার কাছে বিভিন্ন সংস্করণের টর থাকলে আউটপুটগুলি আলাদা হবে।
ড্যান ড্যাসক্লেস্কু

1

দ্রুত, মজবুত এবং পোর্টেবল সমাধান

জড়িত অন্যান্য কয়েকটি সমাধানের বিপরীতে tar, নীচের সমাধানটি এমন কোনও মেশিনে কাজ করে যার স্ট্যান্ডার্ড ইউনিক্স ইউটিলিটিস রয়েছে এবং চেকসামিংকে সমান্তরাল করে অন্য সমস্ত সমাধানের চেয়ে দ্রুততর:

find . -type f | xargs -d'\n' -P0 -n1 md5sum | sort -k 2 | md5sum

যেহেতু এটি শেষে একটি বাছাই ব্যবহার করে, কোনও রিয়েল-টাইম অগ্রগতি হয় না, সুতরাং কেবল কমান্ডটি চালানো যাক।

যুক্তিগুলি এখানে যা তা এখানে:

  • find . -type f বর্তমান ডিরেক্টরি এবং এর উপ-ডিরেক্টরিতে সমস্ত ফাইল সন্ধান করে
  • xargs -d'\n'সন্ধানের আউটপুটটি লাইনে বিভক্ত করে (যদি আপনি নতুন লাইনের সাথে ফাইলগুলি রাখার প্রত্যাশা করেন তবে সাধারণ করুন find -print0 | xargs -0)
  • -P0 n1md5sumসমান্তরাল প্রক্রিয়াগুলিতে চালিত হয়, মেশিন দ্বারা সমর্থিত সর্বাধিক সংখ্যক প্রক্রিয়াগুলি ব্যবহার করে (মাল্টি-কোর!)
  • sort -k 2md5sumআউটপুটটির দ্বিতীয় ক্ষেত্র অনুসারে বাছাই করুন , যা প্রতিটি ফাইলের পুরো পথ (প্রথমটি MD5)
  • চূড়ান্ত md5sumফাইল চেকসামগুলির তালিকার একটি চেকসাম গণনা করে, তাই আপনি একটি লাইনে পুরো ডিরেক্টরিটির একটি চেকসাম পান, যা আপনি টার্মিনাল উইন্ডোতে সহজেই তুলনা করতে পারেন

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

রিয়েল-টাইম ভার্বোজ অগ্রগতি

অবশেষে, আপনি যদি রিয়েল-টাইম অগ্রগতি দেখতে চান তবে চেকসামগুলির জন্য অস্থায়ী ফাইলটি ব্যবহার করতে পাইপলাইনটি সংশোধন করুন:

find . -type f | xargs -d\\n -P0 -n1 md5sum | tee /tmp/sums && sort -k 2 /tmp/sums | md5sum

(নোট করুন যে sortডানদিকে সরানো findকাজ করবে না কারণ xargs -P0সমান্তরাল কারণ md5sumএবং ফলাফলগুলি অর্ডার থেকে বেরিয়ে আসতে পারে))

কমান্ড এর এই সংস্করণটি আপনাকে করতে দেয় বিবিধতা দুই /tmp/sumsফাইল এবং তা দেখতে ফাইল ভিন্ন (যদি এটি একই মেশিনে দ্বিতীয় এক নামান্তর করতে ভুলবেন না)।


0

হ্যাশ সম্পর্কিত সমস্ত তথ্য সম্বলিত এক বিশাল ফাইল রাখার পরিবর্তে আমি গাছের প্রতিটি ফোল্ডারে একটি ফাইল তৈরি করার উপায় খুঁজছিলাম। আমি এখানে মন্তব্য থেকে কিছু অনুপ্রেরণা নিয়েছি। খনি এখানে পোস্ট করা থেকে কিছুটা জটিল। আমি ফাইল রোটেশন ব্যবহার করি তবে নতুন খেলোয়াড়দের পক্ষে এটি সবচেয়ে কম জটিল। এই সংস্করণে এটি নতুনগুলির সাথে পুরানো চেক স্যামগুলি ওভাররাইট করে দেবে। আপনি কত ঘন ঘন এটি চালান এবং আপনার 'গভীরতার' প্রয়োজনের উপর নির্ভর করে 2-3 সংস্করণগুলি রাখা ভাল be

[ব্যবহারকারী @ হোস্ট বিন] $ বিড়াল ম্যাকসাইন্ডির 
#! / বিন / ড্যাশ
সিডি $ 1
sha512sum *> .sha512sum

[ব্যবহারকারী @ হোস্ট বিন] $ সন্ধান করুন / var / tmp- টাইপ ডি-প্রিন্ট0 | xargs -0 -i মক্ষাইন্দির}

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

বাকিটি পাঠকের অনুশীলন হিসাবে রেখে দেওয়া হয়েছে।


0

পূর্ববর্তী উত্তরের ভিত্তিতে :

find ./path/to/directory -print0 | LC_ALL=C sort --zero-terminated | tar --create --no-recursion --null --files-from /dev/stdin --file /dev/stdout --verbose --numeric-owner | sha1sum

  • স্থিতিশীল সাজান
  • সংখ্যার মালিক এবং গোষ্ঠী আইডি
  • ভার্বোস অগ্রগতি
  • ফাইলের নাম নিরাপদ

এটি কেবল একটি ফাইলযুক্ত একটি অনুলিপি করা ডিরেক্টরিতে কাজ করে নি, এবং আমার সন্দেহ হয়েছিল যে আমি স্থানীয় হোস্টে দূরবর্তী হোস্টে টার (1.28) এর কিছুটা পুরানো সংস্করণ চালাচ্ছি। দুর্ভাগ্যক্রমে, জেনিয়ালে টার 1.29 টি ব্যাকপোর্ট করা হয়নি ।
ড্যান ড্যাসক্লেস্কু

0

@allquixoticএর উত্তর বিভিন্ন মেশিনে একই হ্যাশগুলি উত্পন্ন করে না যা আমাদের যাচাই করতে এবং ধারাবাহিক হ্যাশগুলিতে সহায়তা করবে না।

নিম্নলিখিত লাইন find . -type f \( -exec md5sum "$PWD"/{} \; \)নিম্নলিখিত আউটপুট ফেরত:

d41d8cd98f00b204e9800998ecf8427e  /home/helloWorld.c
24811012be8faa36c8f487bbaaadeb71  /home/helloMars.c

সুতরাং বিভিন্ন মেশিনে পথটি আলাদা হবে। awk '{print $1}'আমাদের প্রথম কলামটি পেতে সহায়তা করবে, এতে কেবল ফাইলগুলির হ্যাশ রয়েছে। পরে আমাদের সেই হ্যাশগুলি বাছাই করতে হবে, যেখানে বিভিন্ন মেশিনে ক্রমটি আলাদা হতে পারে, যেখানে দুটিরও বেশি ফাইল থাকলে আমাদের আলাদা হ্যাশ করতে পারে।


সমাধান:

ম্যাকের জন্য:

find ./path/to/directory/ -type f \( -exec md5 -q  "$PWD"/{} \; \) | awk '{print $1}' | sort | md5

লিনাক্সের জন্য:

find ./path/to/directory/ -type f \( -exec md5sum "$PWD"/{} \; \) | awk '{print $1}' | sort | md5sum | awk '{print $1}'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.