파일 이름에서 해시 값 추출

파일 이름에서 해시 값 추출

일부 데이터를 아카이브할 때 아카이브의 무결성을 확인하기 위해 파일 이름에 아카이브의 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

관련 정보