如果你有 GNU tar

如果你有 GNU tar

我正在制作一个 RPM,其中所有内容都包含在 .spec 文件中(不要问 :-)。rpmbuild 需要一个“源”文件,所以我试图创建一个空的 tar 文件。但是,如果我不提供任何文件名,tar 会抱怨:

tar: Cowardly refusing to create an empty archive
Try `tar --help' or `tar --usage' for more information.

如何创建一个真正空的 tar 文件?

答案1

您可以使用以下命令强制 GNU 和 BSD tar 创建一个空档案:

tar -cf tarfilename.tar -T /dev/null

答案2

如果你有 GNU tar

使用/dev/null

$ tar -cf empty.tar --files-from /dev/null

或者从标准输入读取 EOF。

$ printf '' | tar -cf empty.tar --files-from -

如果你没有 tar

空 tar 文件只是一个包含 10240 个 NUL 字节的文件。因此,要创建一个空 tar 文件,您甚至不需要,tar而是可以使用以下任一方法:

$ head --bytes=10240 /dev/zero > empty.tar
$ truncate --size=10240 empty.tar
$ fallocate --length=10240 empty.tar
$ dd if=/dev/zero bs=10240 count=1 iflag=fullblock > empty.tar
$ dd if=/dev/zero bs=1 count=10240 > empty.tar

为什么这会起作用?

https://www.gnu.org/software/tar/manual/html_node/Standard.html

从物理上讲,档案由一系列文件条目组成,这些文件条目以档案结束条目终止,该档案结束条目由两个 512 个零字节块组成。

在档案文件的末尾有两个 512 字节的块,用二进制零填充作为文件结束标记。

因此实际上,将 1024 个零字节(两倍 512 字节块)写入文件就足以获得一个空档案:

$ head --bytes=1024 /dev/zero > empty.tar
$ tar tvf empty.tar

如果我们只向文件中写入 1023 个零和一个“一”,tar 将会报错,因为它只发现一个全为零的块(第一个),而不是两个全为零的块,而第二个块并非全为零:

$ { head --bytes=1023 /dev/zero; printf '\001' } > empty.tar
$ tar tvf empty.tar
tar: A lone zero block at 1

但为什么不只是 1024 个零字节,而是 10240 个呢?原因是阻塞或默认记录大小或阻塞因素:

https://www.gnu.org/software/tar/manual/html_node/Blocking-Factor.html

默认的阻塞因子是 20。如果块大小为 512 字节,则我们得到的记录大小为 10240。并且 tar 将始终填充 tarball,以使其大小为记录大小的倍数:

某些设备要求所有写入操作都是某个大小的倍数,因此 tar 会将存档填充到下一个记录边界。

答案3

BSD:tar cvf empty.tar --from-file /dev/null

GNU(Linux):tar cvf empty.tar --files-from /dev/null

索拉里斯:tar cvf empty.tar -I /dev/null

答案4

我可以通过存档单个文件,然后从存档中删除该文件来创建一个空存档。

tar cf empty.tar somefile                   # creates archive
tar --delete -f empty.tar somefile          # remove the file
tar tf empty.tar                            # list contents of archive

这对我有用。

相关内容