2009-01-30 75 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-archive中,文件不是以簇的形式存儲,而是一個接一個地存儲。這就是差異所在。

+0

非常有意義。我完全忘記了塊的大小。 – ieure 2009-01-30 21:11:19

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

有兩種可能性。

小文件

最有可能的,它比其內容小。 As Nils Pipenbrinck wrote,du顯示文件系統分配的空間量,這是因爲文件存儲在文件系統塊中的空間量大於文件的邏輯大小。

要查看文件的邏輯大小,使用du --apparent-size。在這種情況下,結果應該比tar文件小。

稀疏文件

Tar文件可以存儲稀疏文件。如果tarball是使用--sparse創建的,則會記錄稀疏文件中的漏洞,所以tarball可能小於文件的邏輯大小。

如果解壓縮副本中的稀疏信息在某種程度上丟失了(例如,如果您將tarball解壓到不支持稀疏文件的文件系統上,或者壓縮然後解壓縮等),則df將報告擴大的大小。