শুধুমাত্র এমডি 5সাম ব্যবহার করে হ্যাশ মান পান (ফাইলের নাম ছাড়াই)


176

আমি একটি ফাইলের জন্য একটি হ্যাশ মান উত্পন্ন করতে md5sum ব্যবহার করি। তবে আমার কেবল ফাইলের নাম নয়, হ্যাশ মানটি নেওয়া দরকার।

md5=`md5sum ${my_iso_file}`
echo ${md5}

3abb17b66815bc7946cefe727737d295 ./iso/somefile.iso

আমি কীভাবে ফাইলটির নাম 'স্ট্রিপ' করতে পারি এবং কেবলমাত্র মানটিই থেকে যায়?


27
খুব অবাক করা এই md5sum জন্য একটি বিকল্প নয়।
শ্রীধর সারনোবাত

11
একমত! কেন এটি বিকল্প নয়? একজন জিএনইউ-মাস্টার কি কিছু আলোকপাত করতে পারে?
রিনোগো

আপনি যখন কিছু রেইগেক্স দিয়ে ফলাফলটি ছাঁটাই করতে পারেন তখন আপনার কেন "কেবলমাত্র হ্যাশ" পতাকা লাগবে? (আমি ব্যঙ্গাত্মক)
চৌম্বকীয়_ডুড

উত্তর:


163

ওয়েল অন্য উপায় :)

md5=`md5sum ${my_iso_file} | awk '{ print $1 }'`

7
বা md5=`md5sum < ${my_iso_file}` তবে এটি এখনও "-" শেষে আউটপুট করে। তবে তুলনার জন্য এটি যথেষ্ট হওয়া উচিত।
ক্রিস্টোফ ডি ট্রয়ের

ভুল এটি ম্যাক MD5 (/Users/hello.txt) = 24811012be8faa36c8f487bbaaadeb71এবং আপনার কোড রিটার্নে নিম্নলিখিত ফলাফল দেয় MD5
আল্পার

আপনি এর রান পেতে পারেন -যোগ করে | awk '{print $1}'আপনার কোড => শেষ md5sum < ${my_iso_file} | awk '{print $1}'@ChristopheDeTroyer
Alper

191

একটি সাধারণ অ্যারে অ্যাসাইনমেন্ট কাজ করে ... নোট করুন যে bashঅ্যারের প্রথম উপাদানটি সূচি nameছাড়াই কেবলমাত্র সম্বোধন করা যেতে পারে [0], অর্থাত্, $md5md5sum এর 32 টি অক্ষর রয়েছে।

md5=($(md5sum file))
echo $md5
# 53c8fdfcbb60cf8e1a1ee90601cc8fe2

অসাধারণ. কেবল একটি প্রশ্ন, আমি জানি যে প্রশ্নটি ট্যাগ করা হয়েছে bash, তবে আপনি কি আমাকে বলতে পারবেন অ্যারে যদি কেবলমাত্র একটি বৈশিষ্ট্য বা কিছু শেল স্ট্যান্ডার্ড?
জাইজ

প্রথম লাইনটি একটি লুপের জন্য ডো বিভাগের ভিতরে কাজ করে না ... বাশ নব্বী হিসাবে আমি এখনও জানি না কেন
অ্যান্ডি

@ অ্যান্ডি: আপনি যদি কোডটির এই লাইনটি চেষ্টা করেন (টার্মিনালে, বা কোনও স্ক্রিপ্টে): echo>file; for i in file; do md5=($(md5sum file)); echo $md5; done- এটির ফলাফল হওয়া উচিত68b329da9893e34099c7d8ad5cb9c940
পিটার।

1
কীভাবে echo ($(echo -n foo | md5sum))কাজ হয় না? আউট ত্রুটি bash: syntax error near unexpected token $(echo -n foo | md5sum)'
lkraav

2
@lkraav: কমান্ড echo -n foo | md5sum আউটপুট 2 শেল শব্দ থেকে stdout- এ : acbd18db4cc2f85cedef654fccc4a4d8এবং -( -যেমন উৎস নির্দেশ করে stdin )। - আপনাকে কমান্ড সাবস্টিটিউশন : ব্যবহার করে এই শব্দগুলিকে একটি স্ট্রিংয়ে ক্যাপচার করতে বাশ বলতে হবে । - বন্ধনী দুটি উপাদান সহ একটি ব্যাশ অ্যারে উত্পাদন করে। যাইহোক, যদি আপনি যে অ্যারের কনস্ট্রাক্ট ধার্য আবশ্যক একটি পরিবর্তনশীল নামের; অত: পর ব্যবহার MD5 অ্যারের নামের: । আপনি কোনও পরিবর্তনশীল নামকে অ্যারে বরাদ্দ $( command )()( … )md5=($(echo -n foo | md5sum))
করেননি

57

আপনি cutফাঁকা জায়গায় লাইনটি বিভক্ত করতে এবং কেবলমাত্র এই জাতীয় প্রথম ক্ষেত্রটিতে ফিরে আসতে পারেন:

md5=$(md5sum "$my_iso_file" | cut -d ' ' -f 1)

18

7
@ কেজারেকটমাকাকাক সত্য, তবে কেবলমাত্র এই উত্তরের পদ্ধতিটি ব্যবহার করে আপনি কমান্ডটি নিজেই পরিবর্তন করে বিভিন্ন হ্যাশিং অ্যালগরিদম দিয়ে এটি পুনরায় ব্যবহার করতে পারেন। md5sum-> আপনার sha256sumকী পরিমাণ অক্ষর "কাটা" দরকার তা স্মরণ না করেই।
ডেভিড তাবারনারো এম।

23

ম্যাক ওএস এক্সে:

md5 -q file

আমার ম্যাক ওএস এক্স 10.7 এ কাজ করে না। তবে পোস্ট করার জন্য ধন্যবাদ, যাই হোক না কেন এটি সংস্করণে কাজ করে।
শ্রীধর সারনোবাত

এছাড়াও gmd5sumথেকে এখানে উল্লিখিত অন্যান্য উত্তরের coreutilsমতো ম্যাকওএসে কাজ করবে md5sum
আন্তন তারাসেনকো

14
md5="$(md5sum "${my_iso_file}")"
md5="${md5%% *}" # remove the first space and everything after it
echo "${md5}"

খুশী হলাম। এক নোট - প্রথম লাইনে আপনার চারপাশের কোট প্রয়োজন হবে না $()(যদিও তাদের কোন ক্ষতি করতে) কিন্তু অবশ্যই প্রায় তাদের প্রয়োজন ${}
রোমান চ্যাপলিয়াক

1
@ রোমান: হ্যাঁ, আমি অভ্যাসগতভাবে কোনও প্রকারের উদ্ধৃতি দেওয়ার প্রবণতা রাখি (যদি না করার কারণ থাকে তবে) - কোটেশনগুলি এড়িয়ে যাওয়া নিরাপদ ক্ষেত্রে যেসব ক্ষেত্রে নিরাপদ রয়েছে সেগুলি সম্পর্কে নজর রাখা আরও সহজ। (যদিও এই ক্ষেত্রে, আমি তাদের প্রকৃত ফাইলের নামটি ছেড়ে দিয়েছি ... একটি সম্পাদনার জন্য দাঁড়ান
গর্ডন ডেভিসন

5

একমুখী:

set -- $(md5sum $file)
md5=$1

অন্য উপায়:

md5=$(md5sum $file | while read sum file; do echo $sum; done)

অন্য উপায়:

md5=$(set -- $(md5sum $file); echo $1)

(আপনি খুব সাহসী এবং ব্যাকস্ল্যাশগুলির সাথে খুব ভাল না হলে ব্যাক-টিক দিয়ে চেষ্টা করে দেখুন না that)

অন্যান্য সমাধানগুলির চেয়ে এই সমাধানগুলির সুবিধা হ'ল এগুলি বা md5sumঅন্যান্য প্রোগ্রামের চেয়ে কেবল কেবল এবং শেলটিই ডাকে । আসলে এটি গুরুত্বপূর্ণ কিনা তাও এখন পৃথক প্রশ্ন; পার্থক্যটি লক্ষ্য করে আপনাকে সম্ভবত চাপ দেওয়া হবে।awksed


4

আরেকটি উপায় হ'ল:

md5sum filename |cut -f 1 -d " "

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



2

আপনার যদি এটি মুদ্রণের প্রয়োজন হয় এবং নতুন লাইনের প্রয়োজন না হয় তবে আপনি এটি ব্যবহার করতে পারেন:

printf $(md5sum filename)


0

md5sumফাইলের নামে ব্যাকস্ল্যাশ থাকলে হ্যাশের আগে ব্যাকস্ল্যাশ রাখে। প্রথম 32 টি অক্ষর বা প্রথম স্থানের আগে যে কোনও কিছু সঠিক হ্যাশ নাও হতে পারে। স্ট্যান্ডার্ড ইনপুট ব্যবহার করার সময় এটি হবে না (ফাইলের নামটি কেবলমাত্র -), তাই পিক্সেলবিটের উত্তরটি কার্যকর হবে, তবে অন্য অনেকের মতো কিছু যুক্ত করার প্রয়োজন হবে | tail -c 32


0

ঠিক আছে, আমারও আজ একই সমস্যা ছিল, কিন্তু findকমান্ডটি চালানোর সময় ফাইল এমডি 5 হ্যাশ পাওয়ার চেষ্টা করছি । আমি সর্বাধিক ভোটপ্রাপ্ত প্রশ্ন পেয়েছি md5এবং এটি ফাইন্ড কমান্ড চালানোর জন্য ডাকা একটি ফাংশনে মুড়ে ফেলেছি । আমার জন্য মিশনটি হ'ল একটি ফোল্ডারে সমস্ত ফাইলের জন্য হ্যাশ গণনা করা হয়েছিল এবং এটি হিসাবে আউটপুট hash:filename

md5() { md5sum $1 | awk '{ printf "%s",$1 }'; }
export -f md5
find -type f -exec bash -c 'md5 "$0"' {} \; -exec echo -n ':' \; -print

সুতরাং, আমি এখান থেকে এবং শেল ফাংশন সন্ধান করতে কিছু টুকরো পেয়েছি ?


0

সম্পূর্ণতার খাতিরে রেডেক্স এবং ক্যাপচার গ্রুপটি ব্যবহার করে সেড দিয়ে একটি উপায়:

md5=$(md5sum "${my_iso_file}" | sed -r 's:\\*([^ ]*).*:\1:')

নিয়মিত প্রকাশটি কোনও স্থান না পাওয়া পর্যন্ত একটি গোষ্ঠীতে সমস্ত কিছু ক্যাপচার করে চলেছে। ক্যাপচার গ্রুপকে কাজ করতে আপনাকে সেডে সমস্ত কিছু ক্যাপচার করতে হবে। (সেড এবং ক্যাপ্টর গ্রুপগুলি সম্পর্কে এখানে আরও: https://stackoverflow.com/a/2778096/10926293 ) সেডে
ডিলিমিটার হিসাবে আমি কলোন ব্যবহার করি কারণ সেগুলি ফাইলের পথে বৈধ নয় এবং আমাকে এর মধ্যে স্ল্যাশ থেকে বাঁচতে হবে না ফাইল পাথ.



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