Oracle 백업 디렉터리에 있는 최신 파일의 base64 md5 값을 가져오려고 합니다.
for file in "$(find /oracle/PD1/sapbackup/b*/ -newermt $date -type f)"; do openssl md5 -binary $file | base64 && echo $file >>/md5check/$date/PD1/md5local.txt; done
이 명령을 실행하면 전체 md5 체크섬을 얻을 수 있지만 Y1l1t+SGpQ7Jh0GZm9R5oTrEvfcGM7NaCuYediMH2MY=
base64 값을 얻고 싶습니다.
# openssl md5 -binary /oracle/PD1/sapbackup/beyrnmmq/cntrlPD1.dbf | base64
Y1l1t+SGpQ7Jh0GZm9R5oQ==
for 루프를 사용하여 이 작업을 수행하고 파일 경로 + md5 값을 파일로 출력하려면 어떻게 해야 합니까?
감사해요!
답변1
첫 번째,출력을 반복하지 마십시오find
. 대신 find
명령을 실행하는 데 사용하십시오. 이렇게 하면 파일 이름이 손상되지 않습니다. 같은 이유로 당신이 필요합니다변수 확장 견적.
mkdir -p "/md5check/$date/PD1"
find /oracle/PD1/sapbackup/b*/ -type f -newermt "$date" -exec sh -c '
for pathname do
printf "file = %s\n" "$pathname"
openssl md5 -binary "$pathname" | base64
done' sh {} + >"/md5check/$date/PD1/md5local.txt"
/oracle/PD1/sapbackup/b*/
그러면 수정 타임스탬프가 $date
. 이러한 파일의 경우 짧은 스크립트가 실행됩니다. 스크립트는 파일의 경로 이름과 base64로 인코딩된 MD5 체크섬을 인쇄합니다. 의 출력은 find
마지막으로 지정된 파일로 이동합니다.
출력 파일로의 리디렉션은 분명히 스크립트 내에서 수행될 수 있지만 >>
이는 여러 쓰기를 위해 출력 파일을 열어야 함을 의미합니다(게다가 $date
여기서는 사용할 수 없음).
또한보십시오:
답변2
이는 귀하의 요구 사항을 충족해야 합니다.
난 ~를 지웠어-바이너리옵션은 당신이 md5 해시를 원한다고 생각하기 때문입니다.
for file in "$(find /oracle/PD1/sapbackup/b*/ -newermt $date -type f)"
do
MD5=$(openssl md5 $file | awk '{ print $2 }')
BASE64=$(echo $MD5 | base64)
echo "$file : md5 => [ ${MD5} ] / base64 => [ ${BASE64} ]" >> /md5check/$date/PD1/md5local.txt
done