zxvf xvf ejemplos cvfz create compress archive tar unix

archive - ejemplos - tar xvf



¿Por qué un archivo TAR sería más pequeño que su contenido? (5)

Al no tener conocimiento de qué alquitrán está utilizando o qué tipo de sistema Unix está utilizando, adivino: oldcode contiene numerosos archivos más pequeños, que cuando utilizan el espacio en disco de forma ineficiente, ya que el espacio en disco está asignado por algún tipo de bloque , en lugar de byte por byte. En el archivo tar, están concatenados y aprovechan al máximo el espacio en disco que tienen asignados.

Tengo un directorio que estoy archivando:

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

Entonces el directorio es 1.4gb. El archivo es significativamente más pequeño, sin embargo:

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

Solo 897mb. No está comprimido de ninguna manera:

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

¿Por qué el archivo tar es más pequeño que su contenido?


Esto tiene algo que ver con el tamaño de bloques de su sistema de archivos. man 1 du en MacOSX 10.5.6 declara:

La herramienta du muestra el uso del bloque de sistema de archivos para cada argumento de archivo y para cada directorio en la jerarquía de archivos enraizados en cada argumento de directorio. Si no se especifica ningún archivo, se muestra el uso de bloques de la jerarquía enraizada en el directorio actual.

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

Como puede ver, incluso un archivo de 2 bytes toma un bloque completo de 4kb. Hay algunos sistemas de archivos que evitan este desperdicio de espacio por subasignación de bloque .


Obtienes una diferencia debido a la forma en que funciona el sistema de archivos.

En pocas palabras, su disco está hecho de clusters. Cada grupo tiene un tamaño fijo de, digamos, 4 kilobytes. Si almacena un archivo de 1kb en dicho clúster, no se utilizarán 3kb. Los detalles exactos varían según el tipo de sistema de archivos que utilice, pero la mayoría de los sistemas de archivos funcionan de esa manera.

3kb de espacio desperdiciado no es mucho para un solo archivo, pero si tiene muchos archivos muy pequeños, los desechos pueden convertirse en una parte importante del uso del disco.

Dentro del archivo tar, los archivos no se almacenan en clústeres, sino uno tras otro. De ahí viene la diferencia.


du cuenta los bloques de disco, no el tamaño del archivo.


Hay 2 posibilidades

Archivos pequeños

Lo más probable es que no sea más pequeño que su contenido. Como escribió Nils Pipenbrinck , du muestra la cantidad de espacio que asigna el sistema de archivos, que como los archivos se almacenan en bloques de sistemas de archivos es más que el tamaño lógico del archivo.

Para ver el tamaño lógico del archivo, use du --apparent-size . En este caso, el resultado debe ser más pequeño que el archivo tar.

Archivos dispersos

Los archivos Tar pueden almacenar archivos dispersos. Si el tarball se creó con --sparse , los agujeros en los archivos dispersos se registrarán, por lo que el tarball podría ser más pequeño que el tamaño lógico de los archivos.

Si la información de dispersión en la copia extraída se perdió de alguna manera (por ejemplo, si extrajo el tarball en un sistema de archivos que no admite archivos dispersos, o si se comprimió y luego se descomprimió, etc.), df informará el tamaño expandido.