2009-01-30 2 views
17

У меня есть каталог Я в архиве:Зачем нужен файл TAR меньше его содержимого?

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

ответ

36

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

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

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

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

+0

Идеальный смысл. Я полностью забыл о размере блока. – ieure

+0

В отличие от zip-файлов, которые сжимают, а затем архивируют. – Thom

0

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

4

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

3

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

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

[[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. Есть несколько файловых систем, которые избегают этой пустой площади на block suballocation.

2

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

Небольшие файлы

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

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^