Original article: The Tar Command in Linux: Tar CVF and Tar XVF Explained with Example Commands

El nombre tares la abreviatura de archivo de cinta . Las "cintas" en cuestión serían todas esas unidades de almacenamiento magnético que fueron populares en la década de 1950.

Esto sugiere que la herramienta tar podría ser un poco vieja y haber pasado su mejor momento. Pero la verdad es que, a lo largo de los años y a través de todos los cambios sísmicos en el mundo de TI, tar no ha perdido nada de su poder y valor.

En este artículo, basado en el contenido de mi libro Linux en acción (en inglés), te mostraré los conceptos básicos de la creación, compresión y restauración de archivos tar. Empecemos desde el principio.

Creando archivos

Este ejemplo cogerá todos los archivos y directorios dentro y debajo del directorio de trabajo actual y creará un archivo de almacenamiento que he llamado nombredearchivo.tar.

Aquí uso tres argumentos después del comando tar:

  • la cle dice a tar que cree un nuevo archivo,
  • vestablece la salida por pantalla con detalle para recibir actualizaciones, y
  • fapunta al nombre de archivo que me gustaría darle al archivo.

El *es lo que le indica a tar que incluya todos los archivos y directorios locales de forma recursiva.

$ tar cvf nombredearchivo.tar *
archivo1
archivo2
archivo3
directorio1
directorio1/mascosas
directorio1/mascosas/archivo100
directorio1/mascosas/archivo101

El comando tar nunca moverá ni eliminará ninguno de los directorios y archivos originales que le proporciones, solo hace copias archivadas.

También debes tener en cuenta que el uso de un punto (.) en lugar de un asterisco (*) en el comando anterior incluiría incluso archivos ocultos (cuyos nombres de archivo comienzan con un punto) en el archivo.

Si lo estás haciendo en tu propio ordenador (como deberías), verás un nuevo archivo llamado nombredearchivo.tar. La extensión de nombre de archivo .tar no es necesaria, pero siempre es una buena idea comunicar claramente el propósito de un archivo de tantas formas como sea posible.

Extraer tu archivo para restaurar los archivos es fácil: simplemente usa xvfen lugar de cvf. Eso, en el ejemplo, guardará nuevas copias de los archivos y directorios originales en la ubicación actual.

$ tar xvf nombredearchivo.tar
archivo1
archivo2
archivo3
directorio1
directorio1/mascosas
directorio1/mascosas/archivo100
directorio1/mascosas/archivo101

Por supuesto, también puedes hacer que tar envíe sus archivos extraídos a algún otro lugar usando el argumento -C, seguido de la ubicación de destino:

$ tar xvf nombredearchivo.tar -C /home/misdatos/archivosantiguos/

No siempre querrás incluir todos los archivos dentro de un árbol de directorios en tu archivo.

Supongamos que has producido algunos videos, pero actualmente están guardados en directorios junto con todo tipo de archivos gráficos, de audio y de texto (que contienen tus notas). Los únicos archivos que necesitas respaldar son los clips de video finales con la extensión de nombre de archivo .mp4.

Así es como se hace:

$ tar cvf nombredearchivo.tar *.mp4

Genial. Pero esos archivos de video son enormes. ¿No sería bueno hacer ese archivo un poco más pequeño usando compresión?

¡No digas más! Simplemente, ejecuta el comando anterior con el argumento z (zip). Eso le dirá al programa gzip que comprima el archivo.

Si deseas seguir la convención, también puedes agregar una extensión .gz además de la .tarque ya existe. Recuerda: claridad.

Así es como se haría:

$ tar czvf nombredearchivo.tar.gz *.mp4

Si pruebas esto en tus propios archivos .mp4 y luego ejecutas ls -l en el directorio que contiene los nuevos archivos, puedes notar que el archivo .tar.gz no es mucho más pequeño que el archivo .tar, quizás un 10% más o menos. ¿Por qué?

Bueno, el formato .mp4 del archivo está comprimido, por lo que hay mucho menos margen para que gzip haga su trabajo.

Como tar es plenamente consciente de tu entorno Linux, puedes usarlo para seleccionar archivos y directorios que están fuera de tu directorio de trabajo actual. Este ejemplo agrega todos los archivos .mp4 en el directorio /home/miusuario/Videos/:

$ tar czvf archivename.tar.gz /home/myuser/Videos/*.mp4

Debido a que los archivos de almacenamiento pueden aumentar de tamaño, a veces puede tener sentido dividirlos en varios archivos más pequeños, transferirlos a su nuevo destino y luego volver a crear el archivo original en el otro extremo. La herramienta de división está hecha para este propósito.

En este ejemplo, -b le dice a Linux que divida el archivo nombredearchivo.tar.gz en partes de 1 GB. Luego, la operación nombra cada una de las partes: nombredearchivo.tar.gz.partaa, nombredearchivo.tar.gz.partab, nombredearchivo.tar.gz.partac, etc.:

$ split -b 1G nombredearchivo.tar.gz "nombredearchivo.tar.gz.part"

Por otro lado, vuelve a crear el archivo leyendo cada una de las partes en secuencia (cat nombredearchivo.tar.gz.part*), luego redirige la salida a un nuevo archivo llamado nombredearchivo.tar.gz:

$ cat nombredearchivo.tar.gz.part* > nombredearchivo.tar.gz

Transmisión de archivos del sistema de archivos

Aquí es donde empieza lo bueno. Te mostraré cómo crear una imagen de archivo de una instalación de Linux en funcionamiento y transmitirla a una ubicación de almacenamiento remota, todo con un solo comando. Aquí está el comando:

# tar czvf - --one-file-system / /usr /var \
  --exclude=/home/andy/ | ssh username@10.0.3.141 \
  "cat > /home/username/workstation-backup-Apr-10.tar.gz"

En lugar de tratar de explicar todo eso de inmediato, usaré ejemplos más pequeños para explorarlo pieza por pieza.

Vamos a crear un archivo de los contenidos de un directorio llamado cosasimportantes que está lleno de, bueno, cosas realmente importantes:

$ tar czvf - cosasimportantes/ | ssh usuario@10.0.3.141 "cat > /home/usuario/misarchivos.tar.gz"
cosasimportantes/nombredearchivo1
cosasimportantes/nombredearchivo2
[...]
usuario@10.0.3.141's password:

Déjame explicarte este ejemplo. En lugar de ingresar el nombre del archivo justo después de los argumentos del comando (como lo has hecho hasta ahora), usé un guion (czvf -).

El guion envía datos a la salida estándar. Te permite enviar los detalles del nombre del archivo al final del comando y le dice a tar que espere el contenido de origen del archivo en su lugar.

Luego canaliza (|) el archivo comprimido sin nombre a un inicio de sesión ssh en un servidor remoto donde me pidieron mi contraseña.

El comando que va entre comillas ejecuta cat contra el flujo de datos de archivo, el cual escribió el contenido del flujo en un archivo llamado myfiles.tar.gz en mi directorio de inicio del host remoto.

Una ventaja de generar archivos de esta manera es que evita la sobrecarga de un paso intermedio. No hay necesidad de guardar temporalmente una copia del archivo en la máquina local. Imagina hacer una copia de seguridad de una instalación que ocupa 110 GB de sus 128 GB de espacio disponible. ¿Dónde iría el archivo?

Esto era solo un directorio de archivos. Supongamos que necesitas hacer una copia de seguridad de un sistema operativo Linux activo en una unidad USB para poder moverlo a una máquina separada y colocarlo en la unidad principal de esa máquina.

Partiendo de la base de que ya existe una instalación nueva de la misma versión de Linux en la segunda máquina, la próxima operación de copiar/pegar generará una réplica exacta de la primera.

NOTA: Esto no funcionará en una unidad de destino que aún no tenga instalado un sistema de archivos Linux. Para manejar esa situación, deberá usar dd.

El siguiente ejemplo crea un archivo comprimido en la unidad USB conocido como /dev/sdc1.

El argumento --one-file-system excluye todos los datos de cualquier sistema de archivos, además del actual. Esto significa que las pseudoparticiones como /sys/y /dev/no se agregarán al archivo. Si hay otras particiones que deseas incluir (como lo harás para /usr/y /var/en este ejemplo), deben agregarse explícitamente.

Finalmente, puedes excluir datos del sistema de archivos actual usando el argumento --exclude:

# tar czvf /dev/sdc1/workstation-backup-Apr-10.tar.gz \
  --one-file-system \
  / /usr /var \
  --exclude=/home/usuario/

Ahora volvamos a ese ejemplo de comando de servicio completo. Usando lo que ya aprendiste, archiva todos los directorios importantes de un sistema de archivos y copia el archivo en una unidad USB. Debería tener sentido para ti ahora:

# tar czvf - --one-file-system / /usr /var \
  --exclude=/home/usuario/ | ssh usuario@10.0.3.141 \
  "cat > /home/usuario/workstation-backup-Apr-10.tar.gz"

Hay muchas más bondades de administración en forma de libros, cursos y artículos disponibles en mi bootstrap-it.com.