如何在 Windows 中验证 tar 文件?

如何在 Windows 中验证 tar 文件?

为了腾出更多磁盘空间,我尝试将大量数据压缩成.tar.gz文件。这需要很长时间,所以我想在.bat文件中自动执行该过程。理想情况下,我会创建文件.tar.gz,验证它是否有效,然后从服务器中删除未压缩的数据。如何验证新的 tar 文件在 Windows 中是否有效?Linux 版本的 tar 具有-W看似完美的选项,但 Windows 版本中没有该选项。tar -t在删除原始数据之前,我一直在手动运行并验证它没有遇到任何错误,但我不确定如何在脚本中使用它。

答案1

一般来说,除非您的 RAM 或存储出现严重问题,否则您刚刚创建的存档tar不太可能损坏。应该发生什么?并且其同伴经过了充分的测试。此外,您正在要求在同一台机器上运行的同一程序检查它是否确实产生了损坏的文件,而您怀疑该程序可能会产生损坏的文件。这引发了很多关于什么可能失败的心理模型的问题!


所以,“这需要很长时间”:让我们首先解决这个问题。

当做类似的事情

tar czf compressed.tar.gz folder1/ folder2/ 

tar内部使用 gzip 压缩器的单线程版本。

gzip 不仅不是一个很好的压缩器,而且速度很慢,并且只使用一个线程也无济于事。

你可以通过以下方式实现相同的结果,但速度更快(假设你有多个 CPU 核心,但即使在单个核心上,这也可能是有益的)

tar czf - folder1/ folder2/ | pigz > compressed.tar.gz

你可以得到更好的(但速度稍慢)使用 gzip 压缩

tar czf - folder1/ folder2/ | pigz --best > compressed.tar.gz

pigz只是一个多线程 gzip 实现。

但是 gzip(以及 pigz)是一种糟糕的压缩器,正如所说,速度很慢效率低下。使用一些不是为 20 世纪 80 年代的 PC 而设计的设备,您将获得更快的速度和/或速率。規模差異是备份压缩的常用方法。其速度应该与 gzip 非常相似:

tar czf - folder1/ folder2/ | zstd -10 > compressed-roughly-as-fast-as-gzip.tar.zst

您会注意到,对于大多数类型的数据,结果占用的空间减少了大约 30%(非常粗略,实际上取决于数据!)。

压缩效果大致相同,但速度要快得多

tar czf - folder1/ folder2/ | zstd -3 > compressed-roughly-as-good-as-gzip.tar.zst

zstd和都pigz应该可以使用,方法与安装 相同tar

Linux 版本的 tar 有 -W 选项,看起来很完美,但 Windows 版本中没有这个选项

啊,您的 Linux 版本可能是 GNU tar,而“Windows 版本”(无论是什么)可能是不同的 tar 实现(可能是 busybox 或 bsdtar 版本?)。


如何验证新的 tar 文件在 Windows 中是否有效?

做一件tar 文件无效。基本上,你可以截断它。

因此,检查 tar 文件是否有效的就是简单地解压它。检查内容完好是一个不同的问题,并且基本上只能通过提取它并比较文件来解决(这就是 GNU tar 所做的-W,但它省略了写入文件,而是在 RAM 中进行比较)。

您没有带有该-W选项的 GNU tar,因此您可以执行以下操作(假设 bash):

# create compressed archive
original_folder="$(pwd)"
archivename="compressed.tar.zst"
tar xvf - original_files | zstd -12 > "${archivename}"

# Verify
## enable recursive globbing
setopt globstar
## make temporary directory
tmpdir="$(mktemp -d)"
cd "${tmpdir}"
## extract
tar xf "${original_folder}/${archivename}" || echo "Decompression failed"
## go through all files, hash' em
hashes="$(sha256sum --tag **/*)"
cd "${original_folder}"
echo "${hashes}" | sha256sum --check  || echo "hash verification failed"
## Clean up
rm -rf "${tmpdir}"

相关内容