केवल md5sum (फ़ाइल नाम के बिना) का उपयोग करके हैश मान प्राप्त करें


176

मैं एक फ़ाइल के लिए हैश मान उत्पन्न करने के लिए md5sum का उपयोग करता हूं। लेकिन मुझे केवल हैश मान प्राप्त करने की आवश्यकता है, न कि फ़ाइल नाम।

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

3abb17b66815bc7946cefe727737d295 ./iso/somefree.bo

मैं फ़ाइल का नाम कैसे छीन सकता हूं और केवल मूल्य ही रह सकता है?


27
बहुत आश्चर्यजनक यह md5sum के लिए एक विकल्प नहीं है।
श्रीधर सरनोबत

11
माना! यह एक विकल्प क्यों नहीं है? क्या एक जीएनयू-मास्टर कुछ प्रकाश डाल सकता है?
रिनोगो

जब आप कुछ रेगेक्स के साथ परिणाम ट्रिम कर सकते हैं तो आपको "केवल हैश" ध्वज की आवश्यकता क्यों है? (मैं व्यंग्यात्मक हूँ)
मैग्नेटिक_डूड

जवाबों:


163

खैर एक और तरीका :)

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

7
या md5=`md5sum < ${my_iso_file}` फिर भी यह अंत में आउटपुट "-" है। लेकिन तुलना के लिए यह पर्याप्त होना चाहिए।
क्रिस्टोफ़ डे ट्रॉयर

गलत यह मैक MD5 (/Users/hello.txt) = 24811012be8faa36c8f487bbaaadeb71और आपके कोड रिटर्न पर निम्न आउटपुट देता है MD5
alper

आप अपने कोड के अंत को -जोड़कर भाग सकते हैं | awk '{print $1}'=> md5sum < ${my_iso_file} | awk '{print $1}'@ChristopheDeTroyer
alper

191

एक साधारण सरणी असाइनमेंट काम करता है ... ध्यान दें कि किसी bashसरणी के पहले तत्व को केवल इंडेक्स के nameबिना ही संबोधित किया जा सकता है [0], अर्थात, $md5इसमें md5sum के केवल 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 )। - आप बताना होगा बैश उन पर कब्जा करने के शब्द एक स्ट्रिंग में, का उपयोग कर कमान प्रतिस्थापन : $( command )। - (कोष्ठक 2 तत्वों के साथ )एक बैश सरणी का उत्पादन करते हैं। हालाँकि, आपको उस सरणी निर्माण ( … )को एक चर नाम देना होगा; इसलिए, सरणी नाम के रूप में md5 का उपयोग करना md5=($(echo -n foo | md5sum)):। आपने सरणी को एक चर नाम
पीटर।

57

आप cutरिक्त स्थान पर लाइन को विभाजित करने और केवल पहले ऐसे फ़ील्ड को वापस करने के लिए उपयोग कर सकते हैं :

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

18
याcut -c 1-32
Czarek Tomczak

7
@CzarekTomczak सच है, लेकिन सिर्फ इस उत्तर की विधि का उपयोग करके, आप इसे अलग-अलग हैशिंग एल्गोरिदम के साथ केवल कमांड को बदलकर पुन: उपयोग कर सकते हैं। md5sum-> sha256sumयह याद किए बिना कि आपको "कट" करने के लिए कितने पात्रों की आवश्यकता है।
डेविड टैबरेरो एम।

23

Mac OS X पर:

md5 -q file

मेरे मैक ओएस एक्स 10.7 पर काम नहीं करता है। लेकिन पोस्ट करने के लिए धन्यवाद, जो भी संस्करण इस पर काम करता है।
श्रीधर सरनोबत

इसके अलावा gmd5sumसे coreutilsकी तरह MacOS पर काम करेगा 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)

(जब तक आप बहुत बहादुर न हों और बैकस्लैश के साथ बहुत अच्छे न हों, कोशिश न करें।)

अन्य समाधानों की तुलना में इन समाधानों का लाभ यह है कि वे केवल md5sumअन्य कार्यक्रमों जैसे कि awkया के बजाय आह्वान और खोल देते हैं sed। क्या वास्तव में यह एक अलग प्रश्न है; आप शायद अंतर को नोटिस करने के लिए कड़ी मेहनत करेंगे।


4

एक और तरीका है:

md5sum filename |cut -f 1 -d " "

कट प्रत्येक स्थान पर लाइन को विभाजित करेगा और केवल पहले फ़ील्ड को लौटाएगा।



2

यदि आपको इसे प्रिंट करने की आवश्यकता है और आपको एक नई पंक्ति की आवश्यकता नहीं है, तो आप इसका उपयोग कर सकते हैं:

printf $(md5sum filename)


0

md5sumअगर फ़ाइल नाम में बैकस्लैश है तो हैश से पहले बैकस्लैश डालें। पहले स्थान पर पहले 32 वर्ण या कुछ भी एक उचित हैश नहीं हो सकता है। मानक इनपुट का उपयोग करते समय ऐसा नहीं होगा (फ़ाइल का नाम सिर्फ होगा -), इसलिए पिक्सेलबीट का जवाब काम करेगा, लेकिन कई अन्य लोगों को इस तरह जोड़ने की आवश्यकता होगी | tail -c 32


0

ठीक है, मैं आज भी यही समस्या थी, लेकिन findकमांड चलाते समय फ़ाइल md5 हैश प्राप्त करने की कोशिश कर रहा था । मुझे सबसे अधिक मतदान वाला प्रश्न मिला और इसे एक फ़ंक्शन में लपेट दिया गया जिसे 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:')

एक स्थान पर पहुंचने तक एक समूह में सब कुछ नियंत्रित करता है। कैप्चर ग्रुप वर्किंग करने के लिए आपको सब कुछ sed में कैप्चर करने की आवश्यकता है। (यहां sed और caputer groups के बारे में अधिक जानकारी: https://stackoverflow.com/a/2778096/10926293 )
जैसा कि sed में सीमर मैं कॉलन का उपयोग करता हूं क्योंकि वे फ़ाइल पथ में मान्य नहीं हैं और मुझे स्लैश से बचना नहीं है फ़ाइल पथ।



हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.