比较 zip 文件和解压目录

比较 zip 文件和解压目录

比较 zip 文件和从 zip 文件中提取的目录的最简单方法是什么?如果它们相同,我想删除 zip 文件。

例子。需要检查Archive.ziptravel_photos/目录是否包含相同的文件(即里面的所有文件是否Archive.zip都已正确解压到travel_photos/)。

局限性。我无法更改存档创建和提取的完成方式。这些文件是给我的,我需要事后检查它们。这意味着,我无法创建包含内部所有文件的校验和的文件Archive.zip

要求。我不想创建另一个 zip 存档,travel_photos/因为我需要处理大型目录,可能没有足够的空间来写入其他大文件。出于这个原因,下面的第 2-5 点并不好,尽管我尝试过它们来看看什么可能有效。

到目前为止我已经尝试过的。

  1. 比较md5sum Archive.zip(cd travel_photos; zip -rqq - *) | md5sum,
  2. 比较(cd travel_photos; zip -rqq ../test.zip *); md5sum test.zipmd5sum Archive.zip,
  3. 比较unzip -p test.zip | md5sumunzip -p Archive.zip | md5sum
  4. zcmp test.zip Archive.zip(也与zdiff
  5. unzip -vql test.zip | sort -k8 | md5sumunzip -vql Archive.zip | sort -k8 | md5sum

部分解决方案。如果我更改上面的最后一个示例以删除字段CmprSize(尽管文件完全相同,但两个存档中的文件大小不同?)并从前两行中删除总存档大小,那么我可以验证档案是一样的。

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的作者

相关内容