Uzyskaj wartość skrótu tylko przy użyciu sumy md5 (bez nazwy pliku)

176

Używam md5sum do wygenerowania wartości skrótu dla pliku. Ale muszę otrzymać tylko wartość skrótu, a nie nazwę pliku.

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

3abb17b66815bc7946cefe727737d295 ./iso/somefile.iso

Jak mogę „usunąć” nazwę pliku i zachować tylko wartość?

nieznany z nazwiska
źródło
27
Bardzo zaskakujące, że nie jest to opcja dla md5sum.
Sridhar Sarnobat
11
Zgoda! Dlaczego nie ma takiej opcji? Czy GNU-Master może rzucić trochę światła?
rinogo
Dlaczego potrzebujesz flagi „only hash”, skoro możesz przyciąć wynik za pomocą jakiegoś wyrażenia regularnego? (Jestem sarkastyczny)
Magnetic_dud

Odpowiedzi:

163

Cóż w inny sposób :)

md5=`md5sum ${my_iso_file} | awk '{ print $1 }'`
jyz
źródło
7
Lub md5=`md5sum < ${my_iso_file}` Jednak to nadal wyświetla "-" na końcu. Ale do porównań to powinno wystarczyć.
Christophe De Troyer
Źle to daje następujące dane wyjściowe na Macu MD5 (/Users/hello.txt) = 24811012be8faa36c8f487bbaaadeb71i twój kod wraca MD5.
Alper
Możesz dostać run of -, dodając | awk '{print $1}'koniec swojego kodu => md5sum < ${my_iso_file} | awk '{print $1}'@ChristopheDeTroyer
alper
191

Proste przypisanie tablicy działa ... Zauważ, że pierwszy element bashtablicy może być adresowany tylko przez namebez [0]indeksu, tzn. $md5Zawiera tylko 32 znaki sumy md5.

md5=($(md5sum file))
echo $md5
# 53c8fdfcbb60cf8e1a1ee90601cc8fe2
Peter.O
źródło
Niesamowite. Tylko jedno pytanie, wiem, że pytanie jest oznaczone bash, ale czy możesz mi powiedzieć, czy tablica jest tylko funkcją bash, czy jakimś standardem powłoki?
jyz
pierwsza linia nie działa w sekcji do pętli for ... jako Bash newb Nie wiem jeszcze dlaczego
Andy.
@Andy: Jeśli wypróbujesz ten wiersz kodu (w terminalu lub w skrypcie): echo>file; for i in file; do md5=($(md5sum file)); echo $md5; done- Powinien 68b329da9893e34099c7d8ad5cb9c940
wypisać
1
Dlaczego echo ($(echo -n foo | md5sum))nie działa? Błędy usunięte bash: syntax error near unexpected token $(echo -n foo | md5sum)'
lkraav
2
@lkraav: Polecenie echo -n foo | md5sum wyprowadza 2 słowa powłoki na stdout : acbd18db4cc2f85cedef654fccc4a4d8i -( -wskazuje źródło jako stdin ). - Musisz powiedzieć bash , aby uchwycić te słowa na sznurku, używając polecenia Zmiana : $( command ). - (Nawiasy )tworzą tablicę bash z 2 elementami. Jednak musisz przypisać tę konstrukcję tablicową ( … )do nazwy zmiennej; W związku z tym, przy użyciu MD5 jak nazwa tablicy: md5=($(echo -n foo | md5sum)). Nie przypisałeś tablicy do nazwy zmiennej
Peter. O
57

Możesz użyć, cutaby podzielić linię na spacje i zwrócić tylko pierwsze takie pole:

md5=$(md5sum "$my_iso_file" | cut -d ' ' -f 1)
Brian Campbell
źródło
18
Lubcut -c 1-32
Czarek Tomczak
7
@CzarekTomczak To prawda, ale używając metody tej odpowiedzi, możesz użyć jej ponownie z różnymi algorytmami haszowania, po prostu zmieniając samo polecenie. md5sum-> sha256sumbez pamiętania, jaką ilość znaków trzeba „wyciąć”.
David Tabernero M.,
23

W systemie Mac OS X:

md5 -q file
trevor
źródło
nie działa na moim Mac OS X 10.7. Ale dzięki za wysłanie wiadomości, niezależnie od wersji, na której to działa.
Sridhar Sarnobat
Również gmd5sumz coreutilsdziałałby na MacOS, jak md5sumw innych wymienionych tutaj odpowiedziach.
Anton Tarasenko
14
md5="$(md5sum "${my_iso_file}")"
md5="${md5%% *}" # remove the first space and everything after it
echo "${md5}"
Gordon Davisson
źródło
Miły. Jedna uwaga - w pierwszym wierszu nie potrzebujesz cudzysłowów $()(chociaż nie szkodzą), ale z pewnością potrzebujesz ich wokół ${}.
Roman Cheplyaka,
1
@Roman: tak, zwykle cytuję każde rozszerzenie (chyba że jest powód, by tego nie robić) - jest to łatwiejsze niż śledzenie przypadków, w których można bezpiecznie pominąć cytaty. (Chociaż w tym przypadku zostawiłem je bez rzeczywistej nazwy pliku ... czekaj na edycję.)
Gordon Davisson,
5

Jednokierunkowa:

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

Inny sposób:

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

Inny sposób:

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

(Nie próbuj tego z back-tickami, chyba że jesteś bardzo odważny i bardzo dobry w backslashach.)

Zaletą tych rozwiązań w stosunku do innych rozwiązań jest to, że wywołują one tylko md5sumi powłokę, a nie inne programy, takie jak awklub sed. Czy to rzeczywiście ma znaczenie, to oddzielna kwestia; prawdopodobnie trudno byłoby zauważyć różnicę.

Jonathan Leffler
źródło
4

Innym sposobem jest:

md5sum filename |cut -f 1 -d " "

Wytnij podzieli linię na każdą spację i zwróci tylko pierwsze pole.

azerttyu
źródło
2
md5=$(md5sum < $file | tr -d ' -')
pixelbeat
źródło
2

Jeśli chcesz go wydrukować i nie potrzebujesz nowego wiersza, możesz użyć:

printf $(md5sum filename)
Alex
źródło
1
md5=`md5sum ${my_iso_file} | cut -b-32`
letronje
źródło
0

md5sumumieszcza ukośnik odwrotny przed hashem, jeśli w nazwie pliku występuje ukośnik odwrotny. Pierwsze 32 znaki lub cokolwiek przed pierwszą spacją może nie być prawidłowym hashem. Nie stanie się to przy standardowym wejściu (nazwa pliku to po prostu -), więc odpowiedź pixelbeat będzie działać, ale wiele innych będzie wymagało dodania czegoś takiego | tail -c 32.

Wojciech
źródło
0

Cóż, miałem dzisiaj ten sam problem, ale próbowałem uzyskać hash pliku md5 podczas uruchamiania findpolecenia. Otrzymałem najczęściej głosowane pytanie i opakowałem je w funkcję wywoływaną md5do uruchomienia w poleceniu find. Misją dla mnie było obliczenie skrótu dla wszystkich plików w folderze i wyprowadzenie go jako hash:filename.

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

Więc mam kilka kawałków stąd, a także z funkcji find -exec?

Fabio Montefuscolo
źródło
0

Ze względu na kompletność sposób z sedem przy użyciu wyrażenia regularnego i grupy przechwytywania:

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

Wyrażenie regularare obejmuje wszystko w grupie, aż do osiągnięcia odpowiedniej przestrzeni. Aby uzyskać pracę w grupie, musisz przechwycić wszystko w sed. (Więcej o grupach sed i caputer tutaj: https://stackoverflow.com/a/2778096/10926293 )
Jako separator w sed używam dwukropków, ponieważ nie są one prawidłowe w ścieżkach plików i nie muszę uciekać przed ukośnikiem w ścieżka pliku.

FleMo
źródło
-3

Inny sposób:

md5=$(md5sum ${my_iso_file} | sed '/ .*//' )
codaddict
źródło
-3
md5=$(md5sum < index.html | head -c -4)
Wstrzymano do odwołania.
źródło