2009-01-30 14 views
17

Ich habe ein Verzeichnis Ich bin Archivierung:Warum sollte eine TAR-Datei kleiner sein als ihr Inhalt?

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

So das Verzeichnis 1.4GB ist. Die Datei ist jedoch erheblich kleiner:

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

Nur 897mb. Es ist in keiner Weise komprimiert:

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

Warum ist die TAR-Datei kleiner als ihr Inhalt?

Antwort

36

Sie bekommen einen Unterschied wegen der Art, wie das Dateisystem funktioniert.

Kurz gesagt besteht Ihre Festplatte aus Clustern. Jeder Cluster hat eine feste Größe von - sagen wir mal - 4 Kilobyte. Wenn Sie eine 1-KB-Datei in einem solchen Cluster speichern, wird 3 KB nicht verwendet. Die genauen Details hängen von der Art des verwendeten Dateisystems ab, aber die meisten Dateisysteme funktionieren auf diese Weise.

3kb verschwendeter Speicherplatz ist nicht viel für eine einzelne Datei, aber wenn Sie viele sehr kleine Dateien haben, kann der Abfall ein wesentlicher Teil der Festplattennutzung werden.

Im tar-Archiv werden die Dateien nicht in Clustern gespeichert, sondern nacheinander. Von dort kommt der Unterschied.

+0

Macht vollkommen Sinn. Ich habe die Blockgröße komplett vergessen. – ieure

+0

Im Gegensatz zu ZIP-Dateien, die komprimieren, dann archivieren. – Thom

0

du zählt Festplattenblöcke, nicht Dateigröße duder.

4

Da ich keine Ahnung davon habe, was tar oder welche Art von Unix-System Sie verwenden, habe ich folgende Vermutung: oldcode enthält zahlreiche kleinere Dateien, die selbst Festplattenplatz ineffizient nutzen, da Speicherplatz zugewiesen wird eine Art Block statt Byte für Byte. In der TAR-Datei werden sie verkettet und nutzen den ihnen zugewiesenen Speicherplatz maximal aus.

3

Das hat etwas mit der Blockgröße Ihres Dateisystems zu tun. man 1 mich auf MacOSX 10.5.6 heißt es:

Das ich Programm zeigt die Dateisystem Blocknutzung für jede Datei Argument und für jedes Verzeichnis in der Hierarchie-Datei in jedem Verzeichnis Argumente verwurzelt. Wenn keine Datei angegeben ist, wird die Blockverwendung der Hierarchie im aktuellen Verzeichnis angezeigt.

[[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 . 

Wie Sie auch eine Datei von 2 Bytes sehen einen ganzen Block von 4kb nimmt. Es gibt einige Dateisysteme, die diese Verschwendung von Speicherplatz durch block suballocation vermeiden.

2

Es gibt 2 Möglichkeiten.

Kleine Dateien

Höchstwahrscheinlich es ist nicht kleiner als sein Inhalt. As Nils Pipenbrinck wrote, du zeigt den Speicherplatz an, den das Dateisystem zuweist. Da Dateien in Dateisystemblöcken gespeichert werden, ist dies mehr als die logische Größe der Datei.

Um die logische Größe der Datei anzuzeigen, verwenden Sie du --apparent-size. In diesem Fall sollte das Ergebnis kleiner als die TAR-Datei sein.

Sparse-Dateien

Tar-Dateien können Sparse-Dateien speichern. Wenn der Tarball mit --sparse erstellt wurde, werden die Löcher in den Sparse-Dateien aufgezeichnet, sodass der Tarball kleiner als die logische Größe der Dateien sein kann.

Wenn die Informationen zur Spärlichkeit in Ihrer extrahierten Kopie irgendwie verloren gegangen sind (z. B. wenn Sie den Tarball auf ein Dateisystem extrahiert haben, das keine Sparse-Dateien unterstützt oder wenn er gezippt und dann entpackt wurde), wird gemeldet die erweiterte Größe.