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

时间:2017-02-10 22:19:30

标签: 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,但我对语言非常灵活。

2 个答案:

答案 0 :(得分:3)

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\""'

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

答案 1 :(得分:2)

我不知道它有多快,但在python中它可以通过以下方式完成:

import tarfile
import hashlib

def sha256(flo):
    hash_sha256 = hashlib.sha256()
    for chunk in iter(lambda: flo.read(4096), b'')
        hash_sha256.update(chunk)
    return hash_sha256.hexdigest()

with tarfile.open('/path/to/tar/file') as mytar:
    for member in mytar.getmembers():
        with mytar.extractfile(member) as _file:
            print('{} {}'.format(sha256(_file), member.name))