tar生成的输出文件

tar生成的输出文件

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

$ du -h sampledir/
52K sampledir/

我跑了

$ tar -cf tararchive.tar sampledir/

生成的文件是

$ du -h tararchive.tar 
40K tararchive.tar

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

那么,到底是做什么的呢tar?它是否只是收集目录及其所有文件,插入一些标头以标记它们的结束和开始?如果是这样,tararchive.tar即使不压缩,怎么会比原始目录小呢?

答案1

这是因为文件以整个块的增量消耗空间。因此,如果您的块大小为 512 字节并且您有一个 100 字节的小文件,则它实际使用的大小将向上舍入到最近的块 - 在本例中为 512。当压缩时,因为结果是单个文件,所以效率低下由于只有一个结果文件 - .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

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

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

相关内容