python - 如何计算 tar 文件中每个文件的 shasum

标签 python bash tar

我正在寻找一种方法来计算 tar 文件中包含的每个文件的 sha-256 值。问题是 tar 是 300GB,包含超过 200,000 个文件。

可以通过几种不同的方式在 bash 中执行此操作。

解压然后使用find

tmp=`mktmp --directory extract_XXX`
cd "$tmp"
tar -xf "$tarfile"
find "$tmp" -type f -exec shasum -ba 256 {} +
cd ..
rm -rf "$tmp"

这种方法不好,因为它需要 300GB 空间才能工作,而且速度慢,因为它必须在计算总和之前复制数据

列出 tar 文件并计算各个总和

tar -tf "$tarfile" awk '/\/$/ {next} {print $0}' | while read file ; do
    sum=`tar -xOf "$tarfile" "$file" | shasum -ba 256`
    echo "${sum%-}${file}"
done

这需要较少的磁盘空间但速度要慢得多

如何在不将 tar 文件解压缩到临时目录的情况下一次性完成此操作?

我已将其标记为 bash 和 python...当前代码是 bash,但我对语言很灵活。

最佳答案

tar 实用程序知道它的方式:

tar xvf "$tarfile" --to-command 'shasum -ba 256'

-v 标志很重要,因为 tar 在命令的标准输入中发送每个文件。它会在一行输出文件,在下一行输出 SHA 和,但您可以非常轻松地进一步处理它。

编辑:这里是完整的 shell 代码,用于在单个 tar 文件传递​​中输出 SHA256:

shopt -s extglob
tar xvf "$tarfile" --to-command 'shasum -ba 256' | \
  while read L; do
    [[ $L == *" *-" ]] && echo $SHAFILE ${L:0:64} || SHAFILE=$L
  done

对于 glibc 源码存档,输出如下:

glibc-2.24/.gitattributes c3f8f279e7e7b0020028d06de61274b00b6cb84cfd005a8f380c014ef89ddf48
glibc-2.24/.gitignore 35bcd2a1d99fbb76087dc077b3e754d657118f353c3d76058f6c35c8c7f7abae
glibc-2.24/BUGS 9b2d4b25c8600508e1d148feeaed5da04a13daf988d5854012aebcc37fd84ef6
glibc-2.24/CONFORMANCE 66b6e97c93a2381711f84f34134e8910ef4ee4a8dc55a049a355f3a7582807ec

由 OP 编辑​​:

作为单行,这可以完成为:

tar xf "$tarfile" --to-command 'bash -c "sum=`shasum -ba 256`; echo \"\${sum%-}$TAR_FILENAME\""'

或(在 Ubuntu 20.04 及更高版本上):

tar xf "$tarfile" --to-command 'bash -c "sum=`shasum -ba 256 | cut -d \" \" -f 1`; echo \"\${sum%-}$TAR_FILENAME\""'

手册页在这里:https://www.gnu.org/software/tar/manual/tar.html#SEC87

关于python - 如何计算 tar 文件中每个文件的 shasum,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42169560/

相关文章:

Bash 更新问题

Bash 正则表达式查找和替换

linux - 在 Solaris 报告上解压文件 - tar : directory checksum error

C++ Linux 如何使用 libtar

macos - 如何在 OSX 上使用 TAR 排除目录?

python - 如何覆盖模型上的 delete() 并让它仍然与相关的删除一起使用

python - 如何全局导入一组 Python 模块?

bash - Shell 条件错误 - Bash 语法无法识别

python - 匹配冒号前后的单词

python - Linux 下的 distutils 安装脚本 - 权限问题