Isso ocorre porque os arquivos ocupam espaço em incrementos de bloco inteiro. Portanto, se o tamanho do seu bloco for 512 bytes e você tiver um pequeno arquivo de 100 bytes, o tamanho que ele realmente usará será arredondado para o bloco mais próximo - nesse caso, 512. Quando tarring, porque o resultado é um único arquivo, essa ineficiência é reduzido, pois existe apenas um arquivo resultante - o arquivo .tar.
Você pode realmente ver isso em ação se criar 100 arquivos pequenos e ver o tamanho deles como arquivos individuais vs. combinados. A execução dos seguintes comandos criará um diretório com 100 arquivos de byte único e, em seguida, compara o tamanho deles individualmente versus todos combinados em um contra um tarball criado a partir deles.
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
NOTA: como tar
tem alguma sobrecarga para armazenar cada arquivo em um tarball, se você selecionar o diretório acima, o arquivo tar não é tão pequeno quanto todos os arquivos combinados, mas ainda é muito menor que o arquivos por si mesmos (pelo menos em um sistema de arquivos com tamanho de bloco 4096).
Se você estiver usando um sistema de arquivos ext3 / ext4, você pode ver o tamanho do bloco usando algo como tune2fs -l /dev/sda1 |grep -i 'block size'
(substitua / dev / sda1 qual o sistema de arquivos que você está usando). Isso deve funcionar para o primeiro du
acima dividido por 100.