Получить только значение хеша, используя md5sum (без имени файла)


176

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

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

3abb17b66815bc7946cefe727737d295 ./iso/somefile.iso

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


27
Очень удивительно, что это не вариант для md5sum.
Шридхар Сарнобат

11
Согласовано! Почему это не вариант? Может ли GNU-Master пролить свет?
Риного

Зачем вам нужен флаг «только хеш», когда вы можете обрезать результат с помощью некоторого регулярного выражения? (Я с сарказмом)
Magnetic_dud

Ответы:


163

Ну по другому :)

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

7
Или, md5=`md5sum < ${my_iso_file}` однако, это все еще выводит «-» в конце. Но для сравнения этого должно быть достаточно.
Кристоф Де Тройер,

Неправильно это дает следующий вывод на Mac, MD5 (/Users/hello.txt) = 24811012be8faa36c8f487bbaaadeb71и ваш код возвращается MD5.
Альп

Вы можете получить пробег -, добавив | awk '{print $1}'конец вашего кода => md5sum < ${my_iso_file} | awk '{print $1}'@ChristopheDeTroyer
Alper

191

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

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

Потрясающие. Только один вопрос, я знаю, что вопрос помечен bash, но можете ли вы сказать мне, является ли массив функцией bash only или какой-то стандарт оболочки?
2011 г.

первая строка не работает внутри секции do цикла for ... как новичок Bash, я пока не знаю, почему
Энди

@Andy: Если вы попробуете эту строку кода (в терминале или в скрипте): 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 слова оболочки на стандартный вывод : acbd18db4cc2f85cedef654fccc4a4d8и -( -источник указывает как стандартный вывод ). - Вы должны сказать Баш , чтобы захватить эти слова в строку, используя Подстановку команд : $( command ). - (Скобки )создают массив bash с 2 элементами. Однако вы должны присвоить эту конструкцию массива ( … )имени переменной; следовательно, используя md5 как имя массива: md5=($(echo -n foo | md5sum)). Вы не присвоили массив имени переменной
Peter.O

57

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

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

18
Илиcut -c 1-32
Царек Томчак

7
@CzarekTomczak Верно, но просто используя метод этого ответа, вы можете использовать его с различными алгоритмами хеширования, просто изменив саму команду. md5sum-> sha256sumне помня, какое количество символов нужно «вырезать».
Дэвид Табернеро М.


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

Ницца. Одно замечание - в первой строке вам не нужны кавычки $()(хотя они не приносят вреда), но, безусловно, они нужны ${}.
Роман Чепляка

1
@Roman: да, я обычно цитирую любое расширение (если нет причин не делать этого) - это проще, чем отслеживать случаи, когда безопасно пропускать кавычки. (Хотя в этом случае я оставил их без действительного имени файла ... готовлюсь к редактированию.)
Гордон Дэвиссон

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

Cut разделит линию на каждое пространство и вернет только первое поле.



2

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

printf $(md5sum filename)


0

md5sumставит обратную косую черту перед хешем, если в имени файла есть обратная косая черта. Первые 32 символа или что-либо перед первым пробелом могут быть неправильным хешем. Это не произойдет при использовании стандартного ввода (имя файла будет просто -), поэтому ответ pixelbeat будет работать, но многим другим потребуется добавить что-то подобное | tail -c 32.


0

Ну, сегодня у меня была такая же проблема, но я пытался получить хэш файла md5 при запуске findкоманды. Я получил вопрос с наибольшим количеством голосов и обернул его в функцию, вызываемую md5в команде find. Миссия для меня была вычислить хеш для всех файлов в папке и вывести его как hash:filename.

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

Итак, я получил кое-что отсюда, а также от find -exec функцию оболочки?


0

Для полноты пути с помощью sed используем regex и capture group:

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

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



Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.