Archivado y compresión de datos

tar: Tape ARchiver (Archivador de cinta)

Aunque ya hemos visto un uso para tar en Capítulo 12, Compilando e instalando software libre, no hemos explicado como funciona, lo cual haremos en esta sección. Al igual que find, tar es un utilitario UNIX de larga data, y como tal, su sintaxis es un poco especial. La sintaxis es:

tar [opciones] [archivos ...]

Aquí tiene una lista de algunas opciones. Note que todas tienen una opción larga equivalente, pero para esto deberá consultar la página Man ya que no se indicarán aquí.

[Note]Nota

El guión inicial (-) de las opciones cortas ahora es obsoleto para el comando tar, excepto después de una opción larga.

  • c: Esta opción se usa para crear archivadores nuevos.

  • x: Esta opción se usa para extraer los archivos de un archivador existente.

  • t: Listar los archivos de un archivador existente.

  • v: Esto simplemente listará los archivos mientras se agregan o se extraen de un archivador, o, en conjunción con la opción t (ver arriba), imprime un listado largo de archivo en vez de uno corto.

  • f <archivo>: Crear un archivador de nombre <archivo>, extraer del archivador <archivo> o listar los archivos del archivador <archivo>. Si se omite este parámetro, el archivo predeterminado será /dev/rmt0, que generalmente es el archivo especial asociado con el streamer. Si el parámetro archivo es - (un guión, la entrada o la salida — dependiendo de si está creando un archivador o extrayendo de uno) será asociado con la entrada estándar o la salida estándar.

  • z: Le dice a tar que el archivador a crear debe comprimirse con gzip, o que el archivador del que se quiere extraer está comprimido con gzip.

  • j: Igual que z, pero el programa usado para la compresión es bzip2.

  • p: Cuando se extraen archivos de un archivador, preservar todos los atributos del archivo, incluyendo pertenencia, último tiempo de acceso, y así sucesivamente. Muy útil para los volcados del sistema de archivos.

  • r: Agregar la lista de archivos dada en la línea de comandos a un archivador existente. Note que el archivador al cual quiere agregar archivos ¡no debe estar comprimido!

  • A: Añadir los archivadores que se dan en la línea de comandos al que se da con la opción f. Al igual que con la opción r, los archivadores no deben estar comprimidos para que esto funcione.

Hay muchas, muchas, muchas otras opciones, para una lista completa querrá consultar la página Man tar(1). Vea, por ejemplo, la opción d. Ahora, sigamos con un poquito de práctica. Digamos que quiere crear un archivador con todas las imágenes en /shared/images, comprimirlo con bzip2, que va a llamar images.tar.bz2 y ubicarlo en su directorio personal. Entonces, ingresará:

#
# Nota: ¡debe encontrarse en el directorio desde el
#   que quiere archivar los archivos!
#
$ cd /shared
$ tar cjf ~/images.tar.bz2 images/

Como puede ver, aquí hemos usado tres opciones: c le dijo a tar que queríamos crear un archivador, j le dijo que lo queríamos comprimir con bzip2, y f ~/images.tar.bz2 le dijo que el archivador se iba a crear en nuestro directorio personal, con el nombre images.tar.bz2. Ahora queremos verificar si el archivador es válido. Simplemente lo podemos hacer listando sus archivos:

# Volver a nuestro directorio personal
#
$ cd
$ tar tjvf images.tar.bz2

Aquí, le dijimos a tar que liste (t) los archivos del archivador images.tar.bz2 (f images.tar.bz2), le advertimos que el archivador estaba comprimido con bzip2 (j), y que queríamos un listado largo (v). Ahora, digamos que borró el directorio de las imágenes. Afortunadamente, su archivador está intacto, y ahora lo quiere extraer de nuevo a su lugar original, en /shared. Pero como no quiere arruinar su comando find para las imágenes nuevas, necesita conservar todos los atributos del archivo:

#
# cambiar al directorio donde quiere extraer
#
$ cd /shared
$ tar jxpf ~/images.tar.bz2

¡Y eso es todo!

Ahora, digamos que quiere extraer sólo el directorio images/cars del archivador, y nada más. Entonces puede ingresar esto:

$ tar jxf ~/images.tar.bz2 images/cars

Si esto le preocupa, que no lo haga. Si intenta respaldar archivos especiales, tar los tomará como lo que son, archivos especiales, y no volcará su contenido. Entonces, sí, se puede poner /dev/mem en un archivador :-) ¡Ah!, y también trata correctamente a los vínculos, así que tampoco se preocupe por esto. Para los vínculos simbólicos, también mire la opción h en la página Man.

bzip2 y gzip: Programas de compresión de datos

Puede ver que ya hemos hablado de estos dos programas cuando tratábamos con tar. A diferencia de WinZip bajo Windows, el archivador y la compresión se hacen usando dos utilitarios separados – tar para el archivador, y los dos programas que presentaremos ahora para la compresión de datos: bzip2 y gzip. También existen otros utilitarios de compresión para GNU/Linux tales como zip, arj o rar (pero no se usan con frecuencia).

Al principio, bzip2 había sido escrito como un reemplazo de gzip. Sus relaciones de compresión generalmente son mejores, pero por otra parte, toma más memoria. La razón por la cual todavía está aquí gzip es que todavía es más usado que bzip2.

Ambos comandos tienen una sintaxis similar:

gzip [opciones] [archivo(s)]

Si no se especifica un nombre de archivo, tanto gzip como bzip2 esperarán datos de la entrada estándar y enviarán los resultados a la salida estándar. Por lo tanto, puede usar ambos programas en tuberías. También ambos programas tienen un conjunto de opciones en común:

  • -1, ..., -9: Configuran la relación de compresión. A mayor número, mejor compresión, pero mejor también significa más lenta: “dar para recibir”.

  • -d: Descomprimir el(los) archivo(s). Esto es equivalente a usar gunzip o bunzip2.

  • -c: Volcar el resultado de la compresión/descompresión de los archivos pasados como parámetros a la salida estándar.

[Warning]Aviso

Predeterminadamente, tanto gzip como bzip2 borran el o los archivos que han comprimido (o descomprimido) si no usa la opción -c. Con bzip2 lo puede evitar usando la opción -k pero, gzip ¡no tiene tal opción!

Ahora, algunos ejemplos. Digamos que quiere comprimir todos los archivos que terminan con .txt en el directorio corriente usando bzip2, entonces usará:

$ bzip2 -9 *.txt

Digamos que quiere compartir su archivado de imágenes con alguien, pero dicha persona no tiene bzip2, sólo tiene gzip. No necesita descomprimir el archivador y volver a comprimirlo, simplemente puede descomprimirlo a la salida estándar, usar una tubería, comprimir desde la entrada estándar y volver a direccionar la salida al archivador nuevo:

bzip2 -dc imagenes.tar.bz2 | gzip -9 >imagenes.tar.gz

Y eso es todo. Podría haber ingresado bzcat en lugar de bzip2 -dc. Hay un equivalente para gzip pero su nombre es zcat, no gzcat. También tiene bzless (y zless, respectivamente) si quiere ver un archivo comprimido directamente, sin tener que descomprimirlo. Como ejercicio, intente encontrar el comando que tendría que ingresar para ver los archivos comprimidos sin descomprimirlos, y sin usar bzless o zless