比较 zip 文件和从 zip 文件中提取的目录的最简单方法是什么?如果它们相同,我想删除 zip 文件。
例子。需要检查Archive.zip
和travel_photos/
目录是否包含相同的文件(即里面的所有文件是否Archive.zip
都已正确解压到travel_photos/
)。
局限性。我无法更改存档创建和提取的完成方式。这些文件是给我的,我需要事后检查它们。这意味着,我无法创建包含内部所有文件的校验和的文件Archive.zip
。
要求。我不想创建另一个 zip 存档,travel_photos/
因为我需要处理大型目录,可能没有足够的空间来写入其他大文件。出于这个原因,下面的第 2-5 点并不好,尽管我尝试过它们来看看什么可能有效。
到目前为止我已经尝试过的。
- 比较
md5sum Archive.zip
和(cd travel_photos; zip -rqq - *) | md5sum
, - 比较
(cd travel_photos; zip -rqq ../test.zip *); md5sum test.zip
和md5sum Archive.zip
, - 比较
unzip -p test.zip | md5sum
和unzip -p Archive.zip | md5sum
zcmp test.zip Archive.zip
(也与zdiff
)unzip -vql test.zip | sort -k8 | md5sum
和unzip -vql Archive.zip | sort -k8 | md5sum
部分解决方案。如果我更改上面的最后一个示例以删除字段Cmpr
和Size
(尽管文件完全相同,但两个存档中的文件大小不同?)并从前两行中删除总存档大小,那么我可以验证档案是一样的。
diff -W200 -y <(unzip -vql test.zip | sort -k8 | awk '{if(NR>2) print ($1"\t"$2"\t"$5"\t"$6"\t"$7"\t"$8)}' ) <(unzip -vql Archive.zip | sort -k8 | awk '{if(NR>2) print ($1"\t"$2"\t"$5"\t"$6"\t"$7"\t"$8)}' ) --suppress-common-lines
该解决方案的缺点是我需要创建并保存test.zip
到磁盘。有没有办法在目录travel_photos/
和 zip 文件之间进行比较Archive.zip
?我尝试按如下方式通过管道传输 zip 命令的输出,但它不起作用。
diff -W200 -y <(unzip -vql Archive.zip | sort -k8 | awk '{if(NR>2) print ($1"\t"$2"\t"$5"\t"$6"\t"$7"\t"$8)}' ) < ((cd travel_photos; zip -rqq - *) > unzip -vql | sort -k8 | awk '{if(NR>2) print ($1"\t"$2"\t"$5"\t"$6"\t"$7"\t"$8)}' ) --suppress-common-lines
答案1
您可以使用“folderdiff”(https://pypi.org/project/folderdiff/)将文件夹的内容与 ZIP 存档的内容进行比较,而不将文件存储到磁盘。
还可以比较 2 个 ZIP 存档的内容。
创建“folderdiff”是为了将网络应用程序(例如wordpress)与可信来源进行比较,并查找可能包含后门的修改或添加的文件。
对于每个文件,都会计算 SHA256 哈希值并将其与可信源进行比较。 “folderdiff”需要 2 个参数。第一个是可信源,第二个是文件夹,应与可信源进行比较。
以下示例展示了如何在现有的 WordPress 安装中查找后门:
$ folderdiff wordpress-6.0.3-de_AT.zip /var/www/ --prefix wordpress/
===================== Added ======================
+ webshell.php
==================== Modified ====================
* index.php
披露:我是folderdiff的作者