Получить только значение хеша, используя 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 }'`
jyz
источник
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
Peter.O
источник
Потрясающие. Только один вопрос, я знаю, что вопрос помечен 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не помня, какое количество символов нужно «вырезать».
Дэвид Табернеро М.
23

В Mac OS X:

md5 -q file
Тревор
источник
не работает на моем Mac OS X 10.7. Но спасибо за публикацию, для какой версии это работает.
Шридхар Сарнобат
Также gmd5sumот coreutilsбудет работать на MacOS, как и md5sumв других ответах, упомянутых здесь.
Антон Тарасенко
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 разделит линию на каждое пространство и вернет только первое поле.

azerttyu
источник
2

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

printf $(md5sum filename)
Alex
источник
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 я использую двоеточия, потому что они недопустимы в путях к файлам, и мне не нужно избегать косой черты в Путь файла.

FleMo
источник
-3

По-другому:

md5=$(md5sum ${my_iso_file} | sed '/ .*//' )
codaddict
источник
-3
md5=$(md5sum < index.html | head -c -4)
Приостановлено до дальнейшего уведомления.
источник