我正在为客户开发 ETL 流程。另一家供应商以一组大约 100 个受密码保护的 ZIP 文件形式提供了原始数据。
我想验证给定的密码对于这组文件是否正确。
我当前正在使用的脚本使用循环和 7zip:
#!/bin/bash
set -x
for filename in ../TheData/*Data*of*.zip; do
echo "Checking $filename"
7z t -ple_super_secret_assword $filename
done
通过管道传输到文件的输出如下所示:
Checking ../TheData/Project1999Data_1of7.zip
+ 7z t '-pseeeecret' ../TheData/Project1999Data_1of7.zip
7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,64 bits,4 CPUs Intel(R) Xeon(R) CPU E5-2470 0 @ 2.30GHz (206D7),ASM)
Scanning the drive for archives:
1 file, 632866983 bytes (604 MiB)
Testing archive: ../TheData/Project1999Data_1of7.zip
ERRORS:
Headers Error
当没有管道运行时,会有一个进度表。我认为标题错误是虚假的,因为测试存档工作并抽查一些完整的摘录似乎也可以。
目前不能选择简单地提取所有数据,而是等待更改请求过程进行存储分配。
有没有更快的方法来简单地确保密码适用于一组 zip 文件?
有没有某种方法可以捕获此返回代码并回显简单的通过/失败?7zip 记录了多个返回代码
是否可以更改此脚本以并行运行检查? 7z 似乎只使用了一个核心的 80%,这表明它受 I/O 限制。
使用 t(测试)或 l(列表)函数的 7zip 的性能似乎没有变化。
答案1
检查 shell 错误/退出代码。
当我运行 7zip 来压缩文件(并使用密码保护)时,
echo "now that is what I call bubba" > bubba
7z a -psecret foo bubba
rm bubba #remove for convenience
我可以运行 7zip 来尝试提取/测试存档的内容,并且 7zip 会产生错误,
7z t -pnotsecret foo.7z
...
Extracting bubba Data error in encrypted file. Wrong password?
...
Sub items Errors: 1
然后我可以检查 shell 错误代码,
echo $?
2
当我提供正确的密码时,
7z t -psecret foo.7z
...
Extracting bubba
...
Everything is Ok
然后我检查 shell 错误代码,
echo $?
0
因此,您可以使用 shell 错误/退出代码来简单地检查密码是否正确,或者您可以扫描 7z 和 grep -i“一切正常”的输出。
这是您的脚本的修订版,
#!/bin/bash
set -x
for filename in ../TheData/*Data*of*.zip; do
#echo "Checking $filename"
7z t -ple_super_secret_assword $filename
if [ $? -eq 0 ]; then echo "ok: $filename"
else echo "error: password failed $filename"
fi
done