如何在不解压的情况下获得 zip 内所有文件的 md5sum

问题描述 投票:0回答:3

有没有办法在不解压 zip 的情况下获取 zip 中所有/任何人文件的 md5sum?

我可以使用 unzip 来提取所需的文件 <.zip>

但是我需要在不解压zip的情况下获得md5sum。

linux shell unix sh md5sum
3个回答
4
投票

这可能不正是您正在寻找的东西,但它会让您更接近。您不会提取整个 zip,而是提取一个文件并将其通过管道传输到 md5sum 以获得校验和。如果不读取文件的内容,md5sum 将无法生成哈希值。

假设您有 3 个具有此 MD5 的文件:

b1946ac92492d2347c6235b4d2611184  a.txt
591785b794601e212b260e25925636fd  b.txt
6f5902ac237024bdd0c176cb93063dc4  c.txt

您可以使用

zip final.zip a.txt b.txt c.txt

将它们压缩到一个文件中

当您列出文件时,您会看到有 3 个文件。

unzip -l final.zip
Archive:  final.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        6  2021-08-08 17:20   a.txt
        6  2021-08-08 17:20   b.txt
       12  2021-08-08 17:20   c.txt
---------                     -------
       24                     3 files

要在不解压整个 zip 的情况下获取每个文件的 MD5,您可以执行以下操作:

unzip -p final.zip a.txt | md5sum
b1946ac92492d2347c6235b4d2611184  -

unzip -p final.zip b.txt | md5sum
591785b794601e212b260e25925636fd  -

unzip -p final.zip c.txt | md5sum
6f5902ac237024bdd0c176cb93063dc4  -

替代方案

您可以执行

md5sum *.txt > checksums
来获取所有文件的哈希值并将它们存储在校验和文件中。将其添加到 zip 中,以便您在将文件添加到 zip 时知道每个文件的 md5。


0
投票

对于 zip 中的所有文件,您可以使用此功能;

File='final.zip' ; unzip -lqq $File | while read L ; do unzip -p $File ${L##*[[:space:]]} | md5sum | sed "s/-/${L##*[[:space:]]}/" ; done

给予;

b1946ac92492d2347c6235b4d2611184  a.txt
591785b794601e212b260e25925636fd  b.txt
6f5902ac237024bdd0c176cb93063dc4  c.txt

0
投票

基于@MartinMann的回答,无论文件名是否包含空格或特殊字符,该版本都可以正常工作:

ZIPFILE="final.zip"; unzip -Z1 "$ZIPFILE" | grep -v '/$' | while read line; do echo "$(unzip -p "$ZIPFILE" "$line" | md5sum | cut '-d ' -f1)  $L" ; done

给予:

b1946ac92492d2347c6235b4d2611184  a.txt
591785b794601e212b260e25925636fd  b.txt
6f5902ac237024bdd0c176cb93063dc4  path/to/file with spaces.txt
© www.soinside.com 2019 - 2024. All rights reserved.