如何在不使用太多磁盘空间的情况下创建 tar 存档内文件的 sha1 校验和

如何在不使用太多磁盘空间的情况下创建 tar 存档内文件的 sha1 校验和

我想以列表或新文件的形式获取简单 tar 存档内所有文件的 sha1 校验和

无需使用磁盘空间来解压大 tar 文件。一些带有管道和即时计算 sha1 的东西,将输出定向到 /dev/null

我在谷歌上搜索了很多,并用管道做了一些实验,但没有走得太远。

确实可以节省我很多检查备份的时间。

答案1

太容易了 :

tar xvJf myArchive.tar.xz --to-command=sha1sum

结果是这样的:

z/
z/DOCUMENTATION
3c4d9df9bcbd1fb756b1aaba8dd6a2db788a8659 *-
z/getnameenv.sh
1b7f1ef4bbb229e4dc5d280c3c9835d9d061726a *-

或者使用以下命令创建“tarsha1.sh”:

#!/bin/bash

sha1=`sha1sum`
echo -n $sha1 | sed 's/ .*$//'
echo " $TAR_FILENAME"

然后这样使用它:

tar xJf myArchive.tar.xz --to-command=./tarsha1.sh

结果是这样的:

3c4d9df9bcbd1fb756b1aaba8dd6a2db788a8659 z/DOCUMENTATION
1b7f1ef4bbb229e4dc5d280c3c9835d9d061726a z/getnameenv.sh

答案2

这是对 Vouze 答案的增量改进,使脚本的输出看起来与 GNU 的正常输出完全相同*sum

以下版本的处理文件名包含换行符或反斜杠的情况与当前版本的/ /...tarhash.sh的处理方式相同,以防万一有必要。它还保留总和和文件名之间的两个空格(或者单个空格和,如果将命令从 更改为)。md5sumsha1sum*sha1sumsha1sum --binary

只要文件名以相同的方式排序(或者如果您先对两侧进行排序),就可以sha1sum使用您最喜欢的 diff 工具将该脚本的输出与原始输出进行比较。

tarhash.sh

#!/bin/bash
(echo -n "`sha1sum`" | sed 's/-$//' && echo -n "$TAR_FILENAME") |
sed -z 's/\\/\\\\/g; s/\n/\\n/g; /\\/ s/^/\\/; s/$/\n/;'

用法:

# Note: In this tar invocation, make sure not to specify -v
# (The output comes out wrong if it is included).
tar xJf myArchive.tar.xz --to-command=./tarhash.sh > sha1sums.txt

相关内容