ファイル名からハッシュ値を抽出する

ファイル名からハッシュ値を抽出する

一部のデータをアーカイブするときは、アーカイブの整合性を確認するために、ファイル名にアーカイブのsha1ハッシュをエンコードします。

ファイル名からハッシュを抽出して整合性チェックを自動化する方法を見つけようとしています。

echo myid123_2019-08-31_b7769c0e22c7f75b2935afad499852630ca83145.tar.xz | sed -n 's/^.*\([[:xdigit:]]{40}\).*$/\1/p'

echo myid123_2019-08-31_b7769c0e22c7f75b2935afad499852630ca83145.tar.xz | sed -n 's/^.*\([0-9a-fA-F]{40}\).*$/\1/p'

上記の両方のテストは結果が返されませんでした。私は何を逃したことがありませんか?

ファイル名の形式が異なる可能性があるため、ファイルや場所ではなくハッシュを明示的にテストすることをお勧めします。いずれにせよ、ハッシュはハッシュではなく文字で区切られます。

フォローアップ:

助けてくれてありがとう。

私が作りたい最終製品は次のとおりです。

function checkhash () { 
 for f in "$@"
  do 
   test -f $f || continue
   export HASH=$(echo ${f}| grep -o  '[0-9a-fA-F]\{32,128\}' )
   case $(echo -n ${HASH} | wc -c) in
    32)
       echo "${HASH} *${f}" | md5sum -c -
    ;;
    40)
       echo "${HASH} *${f}" | sha1sum -c -
    ;;
    56)
       echo "${HASH} *${f}" | sha224sum -c -
    ;;
    64)
       echo "${HASH} *${f}" | sha256sum -c -
    ;;
    96)
       echo "${HASH} *${f}" | sha384sum -c -
    ;;
    128)
       echo "${HASH} *${f}" | sha512sum -c -
    ;;
    *)
       echo "No Identified HASH found in filename: ${f}"
    ;;
   esac
 done
}

答え1

あなたの例は、ハッシュ文字列が一番右の下線(_)文字の後で始まり、一番左のドット(.)文字の前で終わることを示しています。

ステップ2プロセスが気に入らない場合は、bashで次のように実行できます。

file_name="myid123_2019-08-31_b7769c0e22c7f75b2935afad499852630ca83145.tar.xz"
name_hash="${file_name%%.*}"
hash="${name_hash##*_}"
echo "$hash"

生産する

b7769c0e22c7f75b2935afad499852630ca83145

答え2

いくつかの文脈を提供しますawk

echo myid123_2019-08-31_b7769c0e22c7f75b2935afad499852630ca83145.tar.xz | awk -F'[_.]' '{print $3}'

答え3

おそらくgrepを使用すると、よりきちんとした作業を実行できます。

$ a='myid123_2019-08-31_b7769c0e22c7f75b2935afad499852630ca83145.tar.xz'

$ echo "$a" | grep -o  '[0-9a-fA-F]\{40\}'

b7769c0e22c7f75b2935afad499852630ca83145

これはBREで参照する必要があります{...}\{...\}

答え4

echo "myid123_2019-08-31_b7769c0e22c7f75b2935afad499852630ca83145.tar.xz"|awk -F "_" '{gsub(/\..*/,"",$NF);print $NF}'

出力

b7769c0e22c7f75b2935afad499852630ca83145

関連情報