Получить только значение хеша, используя md5sum (без имени файла) - PullRequest
153 голосов
/ 09 сентября 2010

Я использую md5sum для генерации хеш-значения для файла. Но мне нужно только получить хеш-значение, а не имя файла.

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

3abb17b66815bc7946cefe727737d295 ./iso/somefile.iso

Как я могу "удалить" имя файла и оставить только значение?

Ответы [ 15 ]

171 голосов
/ 25 апреля 2011

Простое присвоение массива работает ... Обратите внимание, что первый элемент массива bash может быть адресован только с помощью name без индекса [0], т. Е. $md5 содержит только 32 символа из md5sum.

md5=($(md5sum file))
echo $md5
# 53c8fdfcbb60cf8e1a1ee90601cc8fe2
144 голосов
/ 09 сентября 2010

ну по-другому :)) 1001 *

md5=`md5sum ${my_iso_file} | awk '{ print $1 }'`
49 голосов
/ 09 сентября 2010

Вы можете использовать cut, чтобы разбить строку на пробелы и вернуть только первое такое поле:

md5=$(md5sum "$my_iso_file" | cut -d ' ' -f 1)
22 голосов
/ 10 сентября 2010

В Mac OS X:

md5 -q file
14 голосов
/ 09 сентября 2010
md5="$(md5sum "${my_iso_file}")"
md5="${md5%% *}" # remove the first space and everything after it
echo "${md5}"
5 голосов
/ 10 сентября 2010

В одну сторону:

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,Имеет ли это значение на самом деле - это отдельный вопрос;вам, вероятно, будет трудно заметить разницу.

3 голосов
/ 15 сентября 2016

Если вам нужно распечатать его и вам не нужен перевод строки, вы можете использовать:

printf $(md5sum filename)
3 голосов
/ 23 мая 2015

Другой способ сделать:

md5sum filename |cut -f 1 -d " "

Вырезать разделит строку на каждое поле и вернет только первое поле.

2 голосов
/ 10 сентября 2010
md5=$(md5sum < $file | tr -d ' -')
0 голосов
/ 17 мая 2019

Для полноты пути с помощью sed с помощью регулярных выражений и группы захвата:

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

Выражение regulare захватывает все в группе, пока не будет достигнут пробел. Чтобы заставить работать группу захвата, вам нужно захватить все в седе. (Подробнее о группах sed и caputer здесь: https://stackoverflow.com/a/2778096/10926293)
В качестве разделителя в sed я использую двоеточия, поскольку они недопустимы в путях к файлам, и мне не нужно экранировать косую черту в пути к файлу.

...