从脚本中的 openssl md5 命令获取 base64 值

从脚本中的 openssl md5 命令获取 base64 值


我正在尝试获取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

相关内容