Почему файл TAR будет меньше, чем его содержимое? - PullRequest
19 голосов
/ 30 января 2009

У меня есть каталог, который я архивирую:

$ du -sh oldcode
1400848
$ tar cf oldcode.tar oldcode

Таким образом, каталог составляет 1,4 ГБ. Файл значительно меньше, хотя:

$ ls -l oldcode.tar
-rw-r--r-- 1 ieure ieure 940339200 2002-01-30 10:33 oldcode.tar

только 897mb. Это никак не сжимается:

$ file oldcode.tar
oldcode.tar: POSIX tar archive

Почему файл tar меньше его содержимого?

Ответы [ 5 ]

38 голосов
/ 30 января 2009

Вы получаете разницу из-за того, как работает файловая система.

Короче говоря, ваш диск состоит из кластеров. Каждый кластер имеет фиксированный размер - скажем, - 4 килобайта. Если вы храните файл размером 1 КБ в таком кластере, 3 КБ не будут использоваться. Точные данные зависят от типа файловой системы, которую вы используете, но большинство файловых систем работают именно так.

3 КБ не слишком много места для отдельного файла, но если у вас много очень маленьких файлов, отходы могут стать значительной частью использования диска.

Внутри tar-архива файлы хранятся не в кластерах, а один за другим. Вот откуда разница.

4 голосов
/ 30 января 2009

Не зная, какой tar вы используете или какую систему Unix используете, вот мое предположение: старый код содержит множество небольших файлов, которые сами по себе неэффективно используют дисковое пространство, поскольку дисковое пространство выделяется некоторыми вроде блока, а не байта за байтом. В файле tar они объединены и максимально используют выделенное им дисковое пространство.

3 голосов
/ 30 января 2009

Это как-то связано с размером блока вашей файловой системы. man 1 du в MacOSX 10.5.6 сообщает:

Утилита du отображает файловую систему использование блока для каждого аргумента файла и для каждого каталога в файловой иерархии с корнем в каждом аргументе каталога. Если файл не указан, отображается использование блока иерархии с корнем в текущем каталоге.

[mirko@borg foo]$ ls -la
total 0
drwxr-xr-x   2 mirko  wheel   68 Jan 30 21:20 .
drwxrwxrwt  10 root   wheel  340 Jan 30 21:16 ..
[mirko@borg foo]$ du -sh
0B  .
[mirko@borg foo]$ touch foo
[mirko@borg foo]$ ls -la
total 0
drwxr-xr-x   3 mirko  wheel  102 Jan 30 21:20 .
drwxrwxrwt  10 root   wheel  340 Jan 30 21:16 ..
-rw-r--r--   1 mirko  wheel    0 Jan 30 21:20 foo
[mirko@borg foo]$ du -sh
0B  .
[mirko@borg foo]$ echo 1 > foo
[mirko@borg foo]$ ls -la
total 8
drwxr-xr-x   3 mirko  wheel  102 Jan 30 21:20 .
drwxrwxrwt  10 root   wheel  340 Jan 30 21:16 ..
-rw-r--r--   1 mirko  wheel    2 Jan 30 21:20 foo
[mirko@borg foo]$ du -sh
4.0K    .

Как видите, даже файл размером 2 байта занимает целый блок размером 4 КБ. Есть некоторые файловые системы, которые избегают этой траты пространства за счет перераспределения блоков .

2 голосов
/ 19 января 2013

Есть 2 варианта.

Маленькие файлы

Скорее всего, не меньше, чем его содержимое. Как писал Нильс Пипенбринк , du отображает объем пространства, выделяемого файловой системой, который, поскольку файлы хранятся в блоках файловой системы, больше, чем логический размер файла.

Чтобы просмотреть логический размер файла, используйте du --apparent-size. В этом случае результат должен быть меньше, чем файл tar.

Разреженные файлы

Tar-файлы могут хранить разреженные файлы. Если тарбол был создан с использованием --sparse, дыры в разреженных файлах будут записаны, поэтому тарбол может быть меньше, чем логический размер файлов.

Если информация о разреженности в вашей извлеченной копии была каким-то образом потеряна (например, если вы распаковали архив в файловую систему, которая не поддерживает разреженные файлы, или если она была заархивирована, а затем разархивирована и т. Д.), То df будет сообщить расширенный размер.

0 голосов
/ 30 января 2009

du считает блоки диска, а не размер файла duder.

...