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ść?


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 }'`

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

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)

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

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}"

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ę.


4

Innym sposobem jest:

md5sum filename |cut -f 1 -d " "

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



2

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

printf $(md5sum filename)


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.


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?


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.



Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.