Yalnızca karma değerini md5sum kullanarak alma (dosya adı olmadan)


176

Bir dosya için bir karma değer oluşturmak için md5sum kullanın. Ama sadece hash değerini almam gerekiyor, dosya adını değil.

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

3abb17b66815bc7946cefe727737d295 ./iso/somefile.iso

Dosya adını nasıl 'kaldırabilirim' ve yalnızca değer olarak kalabilirim?


27
Çok şaşırtıcı bu md5sum için bir seçenek değil.
Sridhar Sarnobat

11
Kabul! Bu neden bir seçenek değil? GNU-Master biraz ışık tutabilir mi?
rinogo

Sonucu biraz normal ifadeyle kesebildiğinizde neden "sadece karma" bayrağına sahip olmanız gerekiyor? (Ben alaycıyım)
Magnetic_dud

Yanıtlar:


163

Peki başka bir yol :)

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

7
Veya md5=`md5sum < ${my_iso_file}` Ancak bu yine de sonunda "-" çıktı. Ancak karşılaştırmalar için bu yeterli olmalıdır.
Christophe De Troyer

Yanlış Mac'te aşağıdaki çıktıyı verir MD5 (/Users/hello.txt) = 24811012be8faa36c8f487bbaaadeb71ve kodunuz geri döner MD5.
alper

Kodunuzun sonuna -ekleyerek koşabilirsiniz | awk '{print $1}'=> md5sum < ${my_iso_file} | awk '{print $1}'@ChristopheDeTroyer
alper

191

Basit bir dizi ataması çalışır ... Bir bashdizinin ilk öğesinin dizin nameolmadan yalnızca adresle adreslenebileceğini [0], yani $md5md5sum öğesinin yalnızca 32 karakterini içerebileceğini unutmayın.

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

Muhteşem. Sadece bir soru, sorunun etiketlendiğini biliyorum bash, ama dizi sadece bir bash özelliği mi yoksa bazı kabuk standardı mı?
jyz

ilk satır bir for döngüsünün do bölümünde çalışmıyor ... Bash newb olarak henüz nedenini bilmiyorum
Andy

@Andy: Bu kod satırını denerseniz (terminalde veya bir komut dosyasında): echo>file; for i in file; do md5=($(md5sum file)); echo $md5; done- Çıktı vermelidir68b329da9893e34099c7d8ad5cb9c940
Peter.O

1
Nasıl oluyor echo ($(echo -n foo | md5sum))da işe yaramıyor? Hatalar çıktı bash: syntax error near unexpected token $(echo -n foo | md5sum)'
Lkraav

2
@lkraav: Komut , stdout : ve ( kaynağı stdin olarak gösterir) echo -n foo | md5sum2 kabuk kelimesi çıkarır . - Komut Değiştirme : kullanarak bash bu kelimeleri bir dizeye yakalamak için söylemelisiniz . - Köşeli parantezler 2 elemanlı bir bash dizisi üretir . Ancak, bu dizi yapısını bir değişken adına atamalısınız ; bu nedenle, kullanılarak md5 dizisi adı: . Diziyi değişken bir ada acbd18db4cc2f85cedef654fccc4a4d8--$( command )()( … )md5=($(echo -n foo | md5sum))
atamadınız

57

Sen kullanabilirsiniz cutboşluklar üzerinde çizgi bölünmüş ve sadece bu tür ilk alan dönmek için:

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

18
Veyacut -c 1-32
Czarek Tomczak

7
@CzarekTomczak Doğru, ancak sadece bu yanıtın yöntemini kullanarak, sadece komutun kendisini değiştirerek farklı karma algoritmalarla tekrar kullanabilirsiniz. md5sum-> sha256sum"kesmeniz" gereken karakter sayısını hatırlamadan.
David Tabernero M.15

23

Mac OS X'te:

md5 -q file

Mac OS X 10.7 cihazımda çalışmıyor. Ancak, yayınladığınız için teşekkürler, bunun hangi sürümde çalıştığı.
Sridhar Sarnobat

Ayrıca gmd5sum gelen coreutilsgibi MacOS üzerinde çalışacak md5sumburada bahsedilen diğer yanıtlar.
Anton Tarasenko

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

Güzel. Bir not - ilk satırda $()( tırnaklara rağmen) tırnaklara ihtiyacınız yok, ancak kesinlikle etrafta onlara ihtiyacınız var ${}.
Roman Cheplyaka

1
@Roman: evet, alışkanlık olarak herhangi bir genişlemeyi teklif etme eğilimindeyim (yapmamak için bir neden yoksa) - tırnak işaretlerini atlamanın güvenli olduğu durumları takip etmekten daha kolaydır. (Bu durumda, onları gerçek dosya adından çıkardım ... bir düzenleme için bekleyin.)
Gordon Davisson

5

Tek yön:

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

Diğer yol:

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

Diğer yol:

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

(Çok cesur ve ters eğik çizgilerle çok iyi değilseniz, geri keneler ile denemeyin.)

Bu çözümlerin diğer çözümlere göre avantajı, veya md5sumgibi diğer programlardan ziyade yalnızca çağırmaları ve kabuklarıdır . Bunun gerçekten önemli olup olmadığı ayrı bir sorudur; muhtemelen farkı fark etmekte zorlanırsınız.awksed


4

Başka bir yol yapmak:

md5sum filename |cut -f 1 -d " "

Kesme, çizgiyi her boşluğa böler ve yalnızca ilk alanı döndürür.



2

Yazdırmanız gerekiyorsa ve yeni bir satıra gerek duymuyorsanız, şunları kullanabilirsiniz:

printf $(md5sum filename)


0

md5sumdosya adında ters eğik çizgi varsa karma işaretini karma değerinin önüne koyar. İlk boşluktan önceki 32 karakter veya herhangi bir şey uygun bir karma olmayabilir. Standart girdi kullanıldığında gerçekleşmez (dosya adı sadece - olacaktır), bu yüzden pixelbeat'ın cevabı işe yarayacaktır, ancak diğerleri gibi bir şey eklemeyi gerektirecektir | tail -c 32.


0

Peki, bugün aynı sorunu vardı, ama findkomutu çalıştırırken md5 hash dosyasını almaya çalışırken . En çok oylanan soruyu aldım ve md5find komutunda çalıştırmak için adlandırılan bir işleve sardım. Benim için misyon, bir klasördeki tüm dosyalar için karma hesaplamak ve çıktı olarak oldu hash:filename.

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

Yani, buradan ve ayrıca -exec bir kabuk işlevi bulmak bazı parçaları var ?


0

Tamlık uğruna regex ve yakalama grubunu kullanan sed ile bir yol:

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

Normal ifade, bir boşluğa ulaşılana kadar gruptaki her şeyi yakalar. Yakalama grubunun çalışmasını sağlamak için sed'deki her şeyi yakalamanız gerekir. (Sed ve caputer grupları hakkında daha fazla bilgi için: https://stackoverflow.com/a/2778096/10926293 )
Sed dosyasındaki sınırlayıcı olarak, dosya yollarında geçerli olmadığından sütunları kullanıyorum ve eğik çizgiden kaçmak zorunda değilim dosya yolu.



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.