tar 生成的输出文件

Bow*_*ark 2 tar directory disk-usage

tar可用于将整个目录收集到一个文件中。我尝试使用sampledir仅包含一些文本文件的示例目录,没有子目录。原来目录占用52K

$ du -h sampledir/
52K sampledir/
Run Code Online (Sandbox Code Playgroud)

我跑了

$ tar -cf tararchive.tar sampledir/
Run Code Online (Sandbox Code Playgroud)

生成的文件是

$ du -h tararchive.tar 
40K tararchive.tar
Run Code Online (Sandbox Code Playgroud)

它小于sampledir: 但在命令中我没有要求任何压缩。我指的是 BSD 版本tar(也在 Ubuntu 中使用)。

那么,究竟是tar什么?它是否只是简单地收集目录及其所有文件,插入一些标题以标记它们的结束和开始?如果是这样,怎么可能tararchive.tar比原来的目录小,甚至不压缩?

sa2*_*289 8

这是因为文件以整个块的增量使用空间。因此,如果您的块大小为 512 字节并且您有一个 100 字节的小文件,则它实际使用的大小将向上舍入到最近的块 - 在这种情况下为 512。 tarring 时,因为结果是单个文件,因此效率低下减少了,因为只有一个结果文件 - .tar 文件。

如果您创建 100 个小文件并将它们的大小视为单个文件与组合在一起,您就可以真正看到这一点。运行以下命令将创建一个包含 100 个单字节文件的目录,然后分别比较它们的大小、全部合并成一个文件以及从它们创建的 tarball。

mkdir tmp_small_file_test
for ((i=0; i<100; i++)); do head -c 1 /dev/zero > tmp_small_file_test/file$i; done
du -sh tmp_small_file_test
#on a 4096 byte block size filesystem this output 404K

cat tmp_small_file_test/file* >>  tmp_small_file_test/all_files_combined
du -sh tmp_small_file_test/all_files_combined
#this output 4.0K

rm -f tmp_small_file_test/all_files_combined
tar -cf tmp_small_file_test.tar tmp_small_file_test
du -sh tmp_small_file_test.tar
#this output 116K
Run Code Online (Sandbox Code Playgroud)

注意:由于tar将每个文件存储在 tarball 中有一些开销,如果您对上述目录进行 tar tar 文件,tar 文件并不像所有文件组合在一起那么小,但它仍然比文件本身小很多(至少在块大小为 4096 的文件系统上)。

如果您使用的是 ext3/ext4 文件系统,您可以使用类似tune2fs -l /dev/sda1 |grep -i 'block size'(替换您正在使用的文件系统的 /dev/sda1)来查看块大小。这应该计算为du上面的第一个除以 100。

  • 是的 — 请参阅 [“文件使用多少磁盘空间?”](http://unix.stackexchange.com/questions/120311/why-are-there-so-many-different-ways-to-measure-disk -用法) (2认同)