1

BlackBerry WebWorks SDK for Tablet OS构建工具会生成一个存档,其中包含文件和一个 MANIFEST.MF,其中包含每个文件的条目和一个 base64 编码的 SHA512 摘要。但是,存在一个错误,即构建中的文件过多会导致构建失败。我试图弄清楚如何自己生成相同的信息。

下面的示例来自MANIFEST.MF,它包含文件名和摘要。但是,base64 变体使用_代替/-代替,+并且没有==填充尾随。

Archive-Asset-Name: air/XX/IMG_0999.jpg
Archive-Asset-SHA-512-Digest: YI_KXWjpJwwsi5MDQPeBQc9SVi-bH6zYq5PgBD3jQiqHu-r-5Hv8A0yh_y5j2T9MpYZ5TVMW4JXHSXNYmpV1tA

我运行 Windows 7,但安装了 GIT,所以我将 MINGW32 作为 bash shell。我发现了 openssl 和 tr 命令的这种管道组合,但它似乎有点杂乱无章。

openssl dgst -sha512 -binary IMG_0999.gif | openssl enc -base64 | tr '+' '-' | tr '/' '_' | tr -d '=' | tr -d '\n'

有没有更好的方法来生成这个摘要?

最终,我将不得不对目录树中的所有图像进行处理。我希望有一个脚本解决方案,而不必编写程序。第二个问题是如何为目录中的所有文件生成清单语法(递归)。这会是包含上述命令的 bash shell 脚本吗?由于我之前没有编写过 shell 脚本,因此这里的任何指针都值得赞赏。

4

2 回答 2

2

你可以通过组合一些东西来缩短你的命令:

openssl dgst -sha512 -binary IMG_0999.gif | openssl enc -base64 | tr '+/' '-_' | tr -d '=\n'

对于树中的所有文件,例如:

find . -type f -name '*.gif' -print0 | xargs -0 -I % sh -c 'openssl dgst -sha512 -binary "$(basename "$1")" | openssl enc -base64 | tr "+/" "-_" | tr -d "=\n" > "$1.sum"' _ $1
于 2011-02-24T02:58:36.883 回答
1

丹尼斯威廉姆森的解决方案让我继续前进,但tr安装的版本(2.0)确实喜欢多字符语法。此外,xargs版本 (4.1) 不喜欢该-I选项。然而,它让我开始了,这才是最重要的。这是我最终得到的结果:

find . -type f -name '*.gif' -print0 | xargs -0 --replace=% sh -c 'echo -e "Archive-Asset-Name: %\nArchive-Asset-SHA-512-Digest: `openssl dgst -sha512 -binary % | openssl enc -base64 | tr "+" "-" | tr "/" "_" | tr -d "=" | tr -d "\n"`\n"'

并生成以下内容(更改图像名称以保护无辜者)

Archive-Asset-Name: ./IMG_0001.gif
Archive-Asset-SHA-512-Digest: AsgQnXYxj07qy-DTlzqYEv3v1UNqbr1sp5kVz0PE8FYwD-q_0VM20Wyci3xunJwdqy59MbyIX1GGtSmhuETUHQ

Archive-Asset-Name: ./IMG_0032.gif
Archive-Asset-SHA-512-Digest: JE3lmvXxOjSpDoUjyvAp92E1T4b8AQGGJBCcBz_1AG2eoBoSRH76LHpWPEUAeXFx_kOqEaDMRGPrpYnlfcnz9g

Archive-Asset-Name: ./IMG_0003.gif
Archive-Asset-SHA-512-Digest: bJJQ-j-s9630FzUh3hP50h7gWYqJQ6o0FP37nUuSeSUmerFxBwR2X0VeTYn-h4cf7szUr4fqDfAKQLOK0gt7zA

我仍然需要调整名称以不带前缀,./但那是另一天。

于 2011-02-24T05:05:56.280 回答