我正在制作一个 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
这对我有用。