2.8.2. Empaquetado

Ya se ha indicado que en unix el empaquetado, esto es, la labor de reunir varios ficheros en un único fichero contenedor es una tarea diferenciada a la de la compresión. Por ello hay un comando particular que se encarga específicamente de esta labor:

tar

Empaqueta varios ficheros en un único paquete contenedor cuya extensión característica es .tar. Al ser una tarea diferencia de la compresión, pueden empaquetarse ficheros sin que exista ninguna acción de compresión. Por ejemplo:

$ echo "Contenido del primer fichero" > fichero1.txt
$ echo "Contenido del segundo fichero" > fichero2.txt
$ tar -cf empaquetado.tar fichero[12].txt
$ ls empaquetado.tar
empaquetado.tar

Esta acción empaquetará ambos ficheros dentro de empaquetado.tar. Como vemos, no hay ni rastro de compresión. tar permite realizar varias acciones, las más habituales son:

-c:

Empaquetar, esto es, a partir de una serie de ficheros (y directorios), generar un fichero contenedor. Arriba se tiene un ejemplo.

-x:

Desempaquetar, esto es, a partir de un fichero contenedor obtener los ficheros de que se compone:

$ tar -xf empaquetado.tar

Esto desempaquetará los dos ficheros, dentro del directorio actual. Si quiere desempaquetarse uno (o varios concretos) pueden expresarse como argumentos del comando a continuación:

$ tar -xf empaquetado.tar fichero1.txt

De esta forma, sólo se desempaquetará fichero1.txt.

-t:

Lista en la salida estándar el contenido del fichero contenedor:

$ tar -lf empaquetado.tar
fichero1.txt
fichero2.txt

Hay alguna otra acción, pero para nuestro uso, vale con estas. Obsérvese que en todos los casos se ha usado la opción -f que permite indicar cuál es el fichero contenedor, que a veces será el destino (cuando se empaqueta) y a veces será el origen (cuando se desempaqueta). Otra opción, complementaria a cualquier acción, es -v que ofrece información adicional. En el caso del empaquetado o el desempaquetado informa de qué ficheros participan en la acción; en caso de listado, nos ofrece una vista semejante a la de ls -l:

$ tar -tvf empaquetado.tar
-rw-rw-r-- profesor/profesor 29 2016-11-15 13:51 fichero1.txt
-rw-rw-r-- profesor/profesor 30 2016-11-15 13:51 fichero2.txt

Nótese que el que se indiquen los permisos y las fechas implica que tar es capaz de almacenarlos y, por tanto, de reproducirlos otra vez cuando el contenido se desempaquete1. Además conserva la estructura de directorios. Por ejemplo:

$ mkdir -p DIR{1/DIR11,2}
$ touch DIR1/{fichero1,DIR11/fichero11}.txt
$ tar -cf estructura.tar DIR[12]
$ tar -vtf estructura.tar
drwxrwxr-x usuario/usuario   0 2016-11-16 09:31 DIR1/
drwxrwxr-x usuario/usuario   0 2016-11-16 09:31 DIR1/DIR11/
-rw-rw-r-- usuario/usuario   0 2016-11-16 09:31 DIR1/DIR11/fichero11.txt
-rw-rw-r-- usuario/usuario   0 2016-11-16 09:31 DIR1/fichero1.txt
drwxrwxr-x usuario/usuario   0 2016-11-16 09:31 DIR2/

Al descomprimir, se reproduce exactamente el árbol de directorios tal y como se expresa. Por ese motivo el comando anterior y este otro:

$ cd /
$ tar -cf estructura_tmp.tar /tmp/DIR[12]
tar: Eliminando la `/' inicial de los nombres
$ tar -vtf estructura_tmp.tar
drwxrwxr-x usuario/usuario   0 2016-11-16 09:31 tmp/DIR1/
drwxrwxr-x usuario/usuario   0 2016-11-16 09:31 tmp/DIR1/DIR11/
-rw-rw-r-- usuario/usuario   0 2016-11-16 09:31 tmp/DIR1/DIR11/fichero11.txt
-rw-rw-r-- usuario/usuario   0 2016-11-16 09:31 tmp/DIR1/fichero1.txt
drwxrwxr-x usuario/usuario   0 2016-11-16 09:31 tmp/DIR2/

No generan exactamente el mismo fichero contenedor. El segundo, al extraer los ficheros creará en el directorio de trabajo un directorio llamado tmp y dentro de él meterá toda la estructura de directorios que antes improvisamos. El primero, en cambio, meterá directamente dentro del directorio actual tal estructura. Por tanto, si queríamos esto último deberíamos habernos metido antes en /tmp. No obstante lo anterior, existe la opción -C que permite decirle a tar desde que directorio operamos sin llega a cambiar de directorio:

$ cd
$ tar -C /tmp -cf estructura.tar DIR{1,2}
$ tar -vtf estructura.tar
drwxrwxr-x usuario/usuario   0 2016-11-16 09:31 DIR1/
drwxrwxr-x usuario/usuario   0 2016-11-16 09:31 DIR1/DIR11/
-rw-rw-r-- usuario/usuario   0 2016-11-16 09:31 DIR1/DIR11/fichero11.txt
-rw-rw-r-- usuario/usuario   0 2016-11-16 09:31 DIR1/fichero1.txt
drwxrwxr-x usuario/usuario   0 2016-11-16 09:31 DIR2/

Esta misma opción también tiene significado cuando descomprimimos. tar desempaqueta en el directorio de trabajo, pero si indicamos un directorio con la opción -C desempaquetará en él:

$ tar -C ~/backups -xf estructura.tar

A pesar de todo, podría ocurrir que hubiéramos creado estructura_tmp.tar sin querer que se incluyera en las rutas de los ficheros. En ese caso existe la opción --strip-components que permite indicar cuántos niveles queremos eliminar al recuperar ficheros. La siguiente orden volcaría directamente en el directorio actual la estructura de directorios creados:

$ tar --strip-components=1 -xf estructura_tmp.tar

La opción -f, como se ha visto, permite indicar el fichero contenedor. Ahora bien, como ocurre con algunos otros comandos, si se indica como nombre de fichero el guión (-), tar usará la entrada estándar (cuando empaqueta) o la salida estándar (cuando desempaqueta). Esto, junto a las tuberías, permite enriquecer el empaquetado.

Por ejemplo, lo habitual cuando se empaqueta es también comprimir. Una forma de hacerlo es la siguiente:

$ tar -C /tmp -cf - DIR{1,2} | xz -9c > estructura.tar.xz

También podríamos desempaquetar este contenedor comprimido gracias a una tubería y la conjunción de xz y tar. Sin embargo, dado que es extremadamente habitual comprimir al empaquetar, tar posee la opción -a que facilita la tarea, permitiendo generar directamente el fichero comprimido:

$ tar -C /tmp -acf estructura.tar.xz DIR{1,2}

tar escogerá el formato de compresión dependiendo de la extensión que indiquemos: soporta gz, bz2 y xz. También se puede descomprimir directamente:

$ tar -axf estructura.tar.xz

Nota

Aunque no se haya hecho así, lo habitual es usar la opción -v también cuando se empaqueta o desempaqueta. De esta manera, la orden nos informará de qué ficheros participan en el proceso.

Al usar tar para empaquetar, se ha indicado que cuáles sean los ficheros o directorios que se empequetan se indican como argumentos. No obstante existe otra posibilidad: la opción -T permite especificar un fichero que contiene la lista de ficheros a empaquetar:

$ cat lista_de_ficheros.txt
DIR1
DIR2
$ tar -cf estructura.tar -T lista_de_ficheros.txt

Esta opción es bastante interesante, porque si se usa como nombre de fichero el guión (-), se toma la entrada estándar para obtener la lista de ficheros, lo cual propicia que pueda usarse algún programa para generar la lista, El más típico es find , que proporciona muchísimos más mecanismos de selección que el propio tar:

$ find -cnewer fichero.referencia | tar --no-recursion -cf paquete.tar -T -

Obsérvese que en este caso es indispensable usar la opción -no-recursion, ya que el comportamiento predeterminado de tar es empaquetar todo los ficheros contenidos dentro del directorio que se indica. Sin embargo, si usamos find este ya penetra dentro del directorio y lista todos los contenidos.

Ver también

Para un tratamiento más profundo de las copias de seguridad, consulte el apartado correspondiente.

Notas al pie

1

Si se añade la opción --acls entonces tambien preservará los permisos extendidos definidos a través de listas de accesos, que se verán más adelante.