El comando Tar en Linux: Tar CVF y Tar XVF explicados con comandos de ejemplo

El nombre tares, según la mayoría de las cuentas, la abreviatura de archivo de cinta . Las "cintas" en cuestión serían todas esas unidades de almacenamiento magnéticas que fueron populares en la década de 1950.

Eso sugiere que la tarherramienta puede ser un poco vieja y pasada de moda. Pero la verdad es que, a lo largo de todos los años y a través de todos los cambios sísmicos en el mundo de las TI, no tarha perdido nada de su poder y valor.

En este artículo, basado en el contenido de mi libro Linux en acción, les 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 tomará todos los archivos y directorios dentro y debajo del directorio de trabajo actual y creará un archivo que he nombrado inteligentemente archivename.tar.

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

  • el cle dice a tar para crear un nuevo archivo,
  • v establece la salida de la pantalla en verbosa para que reciba actualizaciones, y
  • f apunta al nombre de archivo que me gustaría darle al archivo.

El *es lo que dice tarpara incluir todos los archivos y directorios locales de forma recursiva.

$ tar cvf archivename.tar * file1 file2 file3 directory1 directory1/morestuff directory1/morestuff/file100 directory1/morestuff/file101 

El comando tar nunca moverá ni eliminará ninguno de los directorios y archivos originales que lo alimente; solo realiza copias archivadas.

También debe 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á siguiendo en su propia computadora (como definitivamente debería hacerlo), verá un nuevo archivo llamado archivename.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 su archivo para restaurar los archivos es fácil: solo use en xvflugar de cvf. Eso, en el ejemplo, guardará nuevas copias de los archivos y directorios originales en la ubicación actual.

$ tar xvf archivename.tar file1 file2 file3 directory1 directory1/morestuff directory1/morestuff/file100 directory1/morestuff/file101 

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

$ tar xvf archivename.tar -C /home/mydata/oldfiles/ 

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

Suponga que ha producido algunos videos, pero actualmente se guardan en directorios junto con todo tipo de archivos gráficos, de audio y de texto (que contienen sus notas). Los únicos archivos de los que necesita hacer una copia de seguridad son los videoclips finales que usan la extensión de nombre de archivo .mp4.

He aquí cómo hacerlo:

$ tar cvf archivename.tar *.mp4 

Eso es 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 ejecute el comando anterior con el zargumento (zip). Eso le dirá al programa gzip que comprima el archivo.

Si desea seguir la convención, también puede agregar una .gzextensión además de la .tarque ya está allí. Recuerda: claridad.

Así es como se desarrollaría eso:

$ tar czvf archivename.tar.gz *.mp4 

Si prueba esto en sus propios archivos .mp4 y luego ejecuta ls -l en el directorio que contiene los nuevos archivos, puede notar que el .tar.gzarchivo no es mucho más pequeño que el .tararchivo, quizás un 10% más o menos. ¿Qué hay con eso?

Bueno, el .mp4formato de archivo está comprimido en sí mismo, por lo que hay mucho menos espacio para que gzip haga sus cosas.

Como tar es plenamente consciente de su entorno Linux, puede utilizarlo para seleccionar archivos y directorios que viven fuera de su directorio de trabajo actual. Este ejemplo agrega todos los .mp4archivos en el /home/myuser/Videos/directorio:

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

Debido a que los archivos de almacenamiento pueden crecer mucho, a veces puede tener sentido dividirlos en varios archivos más pequeños, transferirlos a su nuevo hogar 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, -ble dice a Linux que divida el archivo archivename.tar.gz en partes del tamaño de 1 GB. A continuación, la operación nombra cada una de las partes: nombrearchivo.tar.gz.partaa, nombrearchivo.tar.gz.partab, nombrearchivo.tar.gz.partac, etc.

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

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

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

Archivos del sistema de archivos de transmisión

Aquí es donde comienza lo bueno. Le 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 [email protected] \ "cat > /home/username/workstation-backup-Apr-10.tar.gz" 

En lugar de intentar explicar todo eso de inmediato, usaré ejemplos más pequeños para explorarlo una pieza a la vez.

Creemos un archivo del contenido de un directorio llamado importantstuff que está lleno de cosas realmente importantes:

$ tar czvf - importantstuff/ | ssh [email protected] "cat > /home/username/myfiles.tar.gz" importantstuff/filename1 importantstuff/filename2 [...] [email protected]'s password: 

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

El guión envía datos a la salida estándar. Le permite enviar los detalles del nombre del archivo de almacenamiento al final del comando y le dice a tar que espere el contenido de origen del archivo.

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

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

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

Eso era solo un directorio de archivos. Suponga que necesita 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.

Suponiendo que ya haya una nueva instalación de la misma versión de Linux en la segunda máquina, la siguiente 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, necesitará usar dd.

The next example creates a compressed archive on the USB drive known as /dev/sdc1.

The --one-file-system argument excludes all data from any file system besides the current one. This means that pseudo partitions like /sys/ and /dev/ won’t be added to the archive. If there are other partitions that you want to include (as you’ll do for /usr/ and /var/ in this example), then they should be explicitly added.

Finally, you can exclude data from the current file system using the --exclude argument:

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

Now let’s go back to that full-service command example. Using what you’ve already learned, archive all the important directories of a file system and copy the archive file to a USB drive. It should make sense to you now:

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

There's much more administration goodness in the form of books, courses, and articles available at my bootstrap-it.com.