验证大量 zip 文件的密码

验证大量 zip 文件的密码

我正在为客户开发 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

相关内容