Ответ 1
Ну другой способ:)
md5=`md5sum ${my_iso_file} | awk '{ print $1 }'`
Я использую md5sum для генерации хэш-значения для файла. Но мне нужно получить только хэш-значение, а не имя файла.
md5=`md5sum ${my_iso_file}`
echo ${md5}
3abb17b66815bc7946cefe727737d295./iso/somefile.iso
Как я могу "удалить" имя файла и сохранить значение?
Ну другой способ:)
md5=`md5sum ${my_iso_file} | awk '{ print $1 }'`
Простое назначение массива работает... Обратите внимание, что первый элемент массива bash
может быть удален только с помощью name
без индекса [0]
, т.е. $md5
содержит только 32 символа md5sum.
md5=($(md5sum file))
echo $md5
# 53c8fdfcbb60cf8e1a1ee90601cc8fe2
Вы можете использовать cut
, чтобы разделить строку на пробелы и вернуть только первое такое поле:
md5=$(md5sum "$my_iso_file" | cut -d ' ' -f 1)
В Mac OS X:
md5 -q file
md5="$(md5sum "${my_iso_file}")"
md5="${md5%% *}" # remove the first space and everything after it
echo "${md5}"
Один из способов:
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
. На самом деле это вопрос - отдельный вопрос; вам, вероятно, будет трудно заметить разницу.
Другой способ:
md5sum filename |cut -f 1 -d " "
Вырезание разделяет линию на каждое пространство и возвращает только первое поле.
Если вам нужно распечатать его и не нужно использовать новую строку, вы можете использовать:
printf $(md5sum filename)
md5=$(md5sum < $file | tr -d ' -')
md5=`md5sum ${my_iso_file} | cut -b-32`
md5sum
помещает обратную косую черту перед хешем, если в имени файла есть обратная косая черта. Первые 32 символа или что-то еще до первого места могут не соответствовать правильному хешу. Этого не произойдет при использовании стандартного ввода (имя файла будет просто), поэтому pixelbeat answer будет работать, но многим другим потребуется добавить что-то вроде | tail -c 32
.
Ну, сегодня у меня была такая же проблема, но я пытался получить хэш файла 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 функцию оболочки?
Для полноты пути с помощью sed используем regex и capture group:
md5=$(md5sum "${my_iso_file}" | sed -r 's:\\*([^ ]*).*:\1:')
Выражение regulare захватывает все в группе, пока не будет достигнут пробел. Чтобы заставить работать группу захвата, вам нужно захватить все в седе. (Подробнее о группах sed и caputer можно прочитать здесь: fooobar.com/questions/21889/...)
В качестве разделителя в sed я использую двоеточия, потому что они недопустимы в путях к файлам, и мне не нужно экранировать косую черту в пути к файлу.
Другой способ:
md5=$(md5sum ${my_iso_file} | sed '/ .*//' )
md5=$(md5sum < index.html | head -c -4)