如何计算tar文件中每个文件的shasum
我正在寻找一种方法来计算tar文件中包含的每个文件的sha-256值。问题是焦油是300GB和超过200,000包含的文件。如何计算tar文件中每个文件的shasum
这将是可能的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文件,然后你可以很容易地进一步处理。
编辑:这里是完整的壳唯一的代码输出在一个单一的tar文件SHA256s传: 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
我不知道有多快会是,但在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))