Подтвердить что ты не робот

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

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

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

3abb17b66815bc7946cefe727737d295./iso/somefile.iso

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

4b9b3361

Ответ 1

Ну другой способ:)

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

В Mac OS X:

md5 -q file

Ответ 5

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

Ответ 6

Один из способов:

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

Другой способ:

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

Другой способ:

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

(Не пытайтесь делать это с помощью back-ticks, если вы не очень храбры и очень хороши с обратной косой чертой.)

Преимущество этих решений над другими решениями заключается в том, что они вызывают только md5sum и оболочку, а не другие программы, такие как awk или sed. На самом деле это вопрос - отдельный вопрос; вам, вероятно, будет трудно заметить разницу.

Ответ 7

Другой способ:

md5sum filename |cut -f 1 -d " "

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

Ответ 8

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

printf $(md5sum filename)

Ответ 9

md5=$(md5sum < $file | tr -d ' -')

Ответ 10

md5=`md5sum ${my_iso_file} | cut -b-32`

Ответ 11

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

Ответ 12

Ну, сегодня у меня была такая же проблема, но я пытался получить хэш файла 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

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

Ответ 13

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

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

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

Ответ 14

Другой способ:

md5=$(md5sum ${my_iso_file} | sed '/ .*//' )

Ответ 15

md5=$(md5sum < index.html | head -c -4)