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