我想以列表或新文件的形式获取简单 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
的处理方式相同,以防万一有必要。它还保留总和和文件名之间的两个空格(或者单个空格和,如果将命令从 更改为)。md5sum
sha1sum
*
sha1sum
sha1sum --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