.. _empaquetado: 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: .. index:: tar :command:`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 :file:`empaquetado.tar`. Como vemos, no hay ni rastro de compresión. :command:`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á :file:`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 :ref:`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 :command:`tar` es capaz de almacenarlos y, por tanto, de reproducirlos otra vez cuando el contenido se desempaquete\ [#]_. 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 :file:`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 :file:`/tmp`. No obstante lo anterior, existe la opción ``-C`` que permite decirle a :command:`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. :command:`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 :file:`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 (``-``), :command:`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, lo cual puede hacerse añadiendo la opción :kbd:`-a` (el formato de compresión se escogerá dependiendo de cuál sea la extensión del archivo contenedor :kbd:`.tar.gz`, :kbd:`.tar.bz2`, :kbd:`.tar.xz`, :kbd:`.tar.zst`)\ [#]_:: $ tar -C /tmp -acf estructura.tar.xz DIR{1,2} para desempaquetar y descomprimir basta hacer lo propio con la opción :kbd:`-x`:: $ tar -axf estructura.tar.xz aunque en este caso se puede prescindir de :kbd:`-a`, ya que :command:`tar` detecta automáticamente que el archivo se encuentra comprimido. También podríamos desempaquetar este contenedor comprimido gracias a una tubería y la conjunción de :command:`xz` y :command:`tar`. .. note:: 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. .. _find+tar: Al usar :command:`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 :ref:`find ` , que proporciona muchísimos más mecanismos de selección que el propio :command:`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 :command:`tar` es empaquetar todo los ficheros contenidos dentro del directorio que se indica. Sin embargo, si usamos :command:`find` este ya penetra dentro del directorio y lista todos los contenidos. .. seealso:: Para un tratamiento más profundo de las copias de seguridad, consulte :ref:`el apartado correspondiente `. .. rubric:: Notas al pie .. [#] Si se añade la opción ``--acls`` entonces tambien preservará los permisos extendidos definidos a través de :ref:`listas de accesos `, que se verán más adelante. .. [#] En realidad, la orden se limita a comprimir el formato :kbd:`tar` exactamente del mismo modo que si hubiéramos usado esta orden:: $ tar -C /tmp -cf - DIR{1,2} | xz -9c > estructura.tar.xz y es enormemente ineficiente, ya que si queremos saber cuál es el índice de archivos presentes (con :kbd:`-t`) se deberá descomprimir el archivo para acceder a esa información. Alternativamente, la orden tiene la opción :kbd:`-I` que permite indicar cuál es el ejecutable de compresión. Si la orden comparte la :ref:`interfaz que hemos analizado para los compresores `, :command:`tar` será capaz de usarla. Por ejemplo, esto comprime el paquete con :ref:`xz ` usando un nivel de compresión de **9**:: $ tar -I "xz -9" -C /tmp -cf estructura.tar.xz DIR{1,2}