Подтвердить что ты не робот

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

У меня есть архив Im архивации:

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

Итак, каталог 1.4gb. Файл значительно меньше:

$ 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 меньше его содержимого?

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

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

[[email protected] 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 ..
[[email protected] foo]$ du -sh
0B  .
[[email protected] foo]$ touch foo
[[email protected] 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
[[email protected] foo]$ du -sh
0B  .
[[email protected] foo]$ echo 1 > foo
[[email protected] 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
[[email protected] foo]$ du -sh
4.0K    .

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

Ответ 4

Есть 2 возможности.

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

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

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

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

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

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

Ответ 5

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