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