我有一个创建“.tar”文件的 bash 脚本。文件创建后,我想测试其完整性,如果完整性不好,则向 root 用户发送电子邮件。
我知道我需要使用该命令tar -tf /root/archive.tar
来检查文件的完整性,但是如何在 bash if 语句中实现此操作并检查错误?
答案1
如果tar
在其输入中发现错误,它将exit(3)
具有非零退出值。对于大多数tar
实现来说,这也是在使用 .list 列出存档内容时完成的t
。因此,您可以简单地检查 的退出值tar
来确定是否出现问题:
if ! tar tf /root/archive.tar &> /dev/null; then
write_an_email_to_root
fi
如果您tar
没有找到 的所有错误t
,您仍然可以将存档提取到stdout
并重定向stdout
到/dev/null
,这将是较慢但更可靠的方法:
if ! tar xOf /root/archive.tar &> /dev/null; then
write_an_email_to_root
fi
1 此符号表示联机帮助页,而不是实际调用。看man 3 exit
。
答案2
抱歉,但你不能,似乎 tar 缺乏测试能力(例如,如果你忘记 *nix 并尝试使用 winrar 测试它,结果将是:“该命令不支持这种类型的存档”)
我在上面的评论中指出,tar 实际上缺乏内部 CRC 来进行比较,因此,如果您使用编辑器更改 tar 存档,列表和提取可能会完美无缺地工作,不会出现错误,但会提取损坏的数据
总之,我最终在这里希望找到一个解决方案,但没有一个,幸运的是有两个好消息:
有非常非常非常罕见的 tar 存档,它们也没有用另一个程序(如 gzip、bzip2 等)压缩,因此该程序将有一个测试解决方案,不压缩它们的人有点蹩脚,真的很蹩脚
对于我个人的问题,我很幸运,解压后,我只是找到了一个md5sum文件,里面有所有文件的CRC(即使是把arhive tar放在网上并且不想压缩它的人,他仍然想被可以验证)
答案3
您可以通过将以下参数传递给来做到这一点tar
:
$ tar -cvzf test.tar test_file