md5sumを使用してハッシュ値のみを取得(ファイル名なし)


176

md5sumを使用して、ファイルのハッシュ値を生成します。しかし、ファイル名ではなく、ハッシュ値を受け取るだけで済みます。

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

3abb17b66815bc7946cefe727737d295 ./iso/somefile.iso

ファイル名を「ストリップ」して値だけを残すにはどうすればよいですか?


27
これはmd5sumのオプションではありません。
Sridhar Sarnobat 2017年

11
同意しました! なぜこれが選択肢にならないのですか?GNUマスターはいくつかの光を当てることができますか?
rinogo 2017

正規表現で結果をトリミングできるのに、なぜ「ハッシュのみ」のフラグが必要なのですか?(私は皮肉です)
Magnetic_dud

回答:


163

まあ別の方法:)

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

7
またはmd5=`md5sum < ${my_iso_file}` ただし、これでも最後に「-」が出力されます。しかし、比較にはこれで十分です。
Christophe De Troyer 2015年

間違っているMD5 (/Users/hello.txt) = 24811012be8faa36c8f487bbaaadeb71と、Macで次の出力が表示され、コードが返されますMD5
アルパー、

コードの終わりを-追加することで実行でき| awk '{print $1}'ます=> md5sum < ${my_iso_file} | awk '{print $1}'@ChristopheDeTroyer
alper

191

単純な配列割り当てが機能します...配列の最初の要素は、インデックスなしでbashによってアドレス指定できることに注意してください。つまり、md5sumの32文字のみが含まれています。 name[0]$md5

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

驚くばかり。たった1つの質問です。質問にタグが付いていることはわかってbashいますが、配列がbashのみの機能なのか、シェル標準なのかを教えていただけますか?
jyz 2014年

最初の行はforループのdoセクション内では機能しません... Bashのnewbとして、理由はまだわかりません
Andy

@Andy:次のコード行を(ターミナル内またはスクリプト内で)試した場合:echo>file; for i in file; do md5=($(md5sum file)); echo $md5; done-出力されるはずです68b329da9893e34099c7d8ad5cb9c940
Peter.O

1
どのように来るecho ($(echo -n foo | md5sum))仕事はないのでしょうか?エラーが発生 bash: syntax error near unexpected token $(echo -n foo | md5sum)'
lkraav

2
@lkraav:このコマンドは、 echo -n foo | md5sum 2つのシェルワードstdout:に出力します(acbd18db4cc2f85cedef654fccc4a4d8およびは、ソースをstdinとして示します)。-あなたは言う必要がありますbashのものをキャプチャするために言葉を使用して、文字列にコマンド置換を:。– ブラケットは、2つの要素を持つbash配列を生成します。ただし、その配列構成を変数名に割り当てる必要があります。したがって、配列名としてmd5を使用します。配列を変数名に割り当てていません--$( command )()( … )md5=($(echo -n foo | md5sum))
Peter.O

57

を使用cutして行をスペースで分割し、最初のそのようなフィールドのみを返すことができます。

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

18
またはcut -c 1-32
Czarek Tomczak 14

7
@CzarekTomczak真ですが、この回答の方法を使用するだけで、コマンド自体を変更するだけで、さまざまなハッシュアルゴリズムで再利用できます。md5sum-> sha256sum「カット」する必要のある文字数を覚えていない。
David Tabernero M.

23

Mac OS Xの場合:

md5 -q file

Mac OS X 10.7では動作しません。しかし、これが機能するどのバージョンでも投稿してくれてありがとう。
Sridhar Sarnobat 2017年

またgmd5sum、ここで説明した他の回答とcoreutils同様にmd5sum、MacOSでも動作します。
アントンTarasenko

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

いいね。1つの注記-最初の行では、引用符は必要ありません$()(害はありませんが)が必要${}です。
Roman Cheplyaka

1
@Roman:ええ、私は拡張をいつも引用する傾向があります(そうしない理由がない限り)-引用をスキップしても安全な場合を追跡するよりも簡単です。(この場合は、実際のファイル名は省略していますが、編集を待機しています。)
Gordon Davisson

5

一方通行:

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

別の方法:

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

別の方法:

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

(非常に勇敢でバックスラッシュが得意でない限り、バックティックでそれを試さないでください。)

他のソリューションに対するこれらのソリューションの利点はmd5sumawkまたはなどの他のプログラムではなく、とシェルのみを呼び出すことsedです。それが実際に重要かどうかは、別の質問です。あなたはおそらく違いに気づくのが難しいでしょう。


4

もう1つの方法は次のとおりです。

md5sum filename |cut -f 1 -d " "

カットは行を各スペースに分割し、最初のフィールドのみを返します。



2

印刷する必要があり、改行が不要な場合は、次のコマンドを使用できます。

printf $(md5sum filename)


0

md5sumファイル名にバックスラッシュがある場合、ハッシュの前にバックスラッシュを置きます。最初の32文字または最初のスペースの前の何かは、適切なハッシュではない可能性があります。標準入力(ファイル名は-のみ)を使用する場合は発生しないため、pixelbeatの回答は機能しますが、他の多くはのようなものを追加する必要があり| tail -c 32ます。


0

さて、私は今日同じ問題を抱えていましたが、findコマンドの実行時にファイルmd5ハッシュを取得しようとしました。私は最も投票された質問を取得し、それ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の方法:

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

正規表現は、スペースに到達するまで、グループ内のすべてをキャプチャしています。キャプチャグループを機能させるには、sedのすべてをキャプチャする必要があります。(ここでsedおよびcaputerグループの詳細:https ://stackoverflow.com/a/2778096/10926293 )
sedの区切り文字としてコロンを使用します。コロンはファイルパスでは無効であり、スラッシュでエスケープする必要がないためです。ファイルパス。



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.