¿Cómo crear y descomprimir un archivo con tar?

tux.pngTiene varios ficheros o carpetas que deseas archivar: la orden tar es su amigo. * Creación de un archivo: quiere archivar el directorio /home/pepe/Mis_documentos en un archivo que llamará (¡como quierá!) por ejemplo: "/carpeta_de_su_archivo/MisDocs.tar". Haga:tar cf /carpeta_de_su_archivo/MisDocs.tar /home/pepe/Mis_documentosExplicaciones: tar: nombre de la orden.

c para crear
/home/pepe/Mis_documentos --> es el nombre de lo que se quiere archivar
MisDocs.tar --> es el nombre que se da al archivo que se va a crear
/carpeta_de_su_archivo/ --> es la carpeta en lo cual quieres que tar cree tu archivo

De paso una pequeña precisión: la orden tar no añade la extensión .tar al final del archivo. Es usted quien debe ponerla. Si la olvida, bastará con renombrar su archivo después.

* Y si quiere archivar varios directorios en el mismo archivo, por ejemplo: /home/pepe/Mis_documentos/ /etc/ /usr/local/ haga:
tar cf /carpeta_de_su_archivo/MisDocs.tar /home/pepe/Mis_documentos /etc/ /usr/local/Explicaciones: el primer nombre de fichero es el del archivo que se va a crear; todos los siguientes son los que se van a archivar por tar.* Algo podrá molestarle cuando haga un archivo. Por ejemplo, si hace:

tar cf /carpeta_de_su_archivo/MisDocs.tar /home/pepe/Mis_documentos, tendrá
* /home/pepe/ en su archivo. Si no lo quiere, haga:

cd /home/pepe/

tar cf /carpeta_de_su_archivo/MisDocs.tar ./Mis_documentos

* Bueno, he entendido como archivar varias carpetas. ¿Pero si quiero excluír un subrepertorio de mi archivo? Por ejemplo, quiero archivar /home/pepe/, pero NO /home/pepe/Mis_documentos/

Muy sencillo. Basta con usar la opción --exclude seguida del nombre del directorio (o del fichero) que no quiere (aquí, haremos --exclude /home/pepe/Mis_documentos). ¡Ojo! NO ponga el / al final del camino, sino no funcionará. Ejemplo: hay que poner /home/pepe/Mis_documentos y NO /home/pepe/Mis_documentos/)

tar cf /carpeta_de_su_archivo/MisDocs.tar /home/pepe --exclude /home/pepe/Mis_documentos

Y si quiere excluír varias carpetas, hay que poner cada vez la opción --exclude delante de cada carpeta que hay que excluir. Ejemplo: para excluir los directorios /home/pepe/Mis_documentos y /home/pepe/Mis_imagenes, basta con hacer:

tar cf /carpeta_de_su_archivo/MisDocs.tar /home/pepe --exclude /home/pepe/Mis_documentos/
* ¿Y si quiero desarchivar... un archivo? Basta con hacer:

tar xf /carpeta_de_su_archivo/MisDocs.tar
x para eXtraer

* Pero antes de desarchivar, quisiera saber qué ficheros hay dentro.

Use la opción "t" y ya está:

tar tf /carpeta_de_su_archivo/ MisDocs.tar

* ¿Y para comprimir el archivo conforme que se va creando, cómo hacer?

Añadir la opción z para comprimir con gzip y la opción j para comprimir con bzip2. (La opción de compresión es la opción predefinida, es decir -5)
tar czf para crear un archivo comprimido por gzip2
tar cjf para crear un archivo comprimido por bzip2
Por supuesto, es mucho más lento.
Es posible comprimir con otras opciones (es decir otras tasas de compresión)

* Para desarchivar un archivo comprimido, es la misma cosa.

tar xzf /carpeta_de_su_archivo/ MisDocs.tar.gz o
tar xjf /carpeta_de_su_archivo/MisDocs.tar.bz

Aquí también, la orden tar no añadirá la extensión tar.gz o tar.bz y tendrá que hacerlo sú mismo. En cambio, si comprima después (con la orden bzip o gzip), la extensión bz o gz se añadirá automáticamente.

* He desarchivado /carpeta_de_su_archivo/ MisDocs.tar y no puedo encontrar los ficheros desarchivados.

Eso es normal: tar desarchiva en el directorio de trabajo, y no necesariamente en el directorio en el cual se halla el archivo. (afortunadamente por cierto, ¿cómo haríamos para desarchivar directamente a partir de un CDrom?)
Así pues, si estoy dentro de /home/pepe y que mi fichero /carpeta_de_su_archivo/MisDocs.tar está dentro de /home/pepe/Mis_documentos/, haciendo:
tar xf /carpeta_de_su_archivo/MisDocs.tar, voy a encontrar el resultado del desarchivo dentro de /home/pepe/ y no en /home/pepe/Mis_documentos/.

Recuerde: para conocer el directorio de trabajo actual (es decir él en donde se encuentra,) hacer pwd.
Para cambiar de directorio, hacer: cd /nuevo_directorio/

* Ya he entendido: si quiero desarchivar dentro de /home/pepe/Mis_documentos/Correo/ (por ejemplo), hago:

cd /home/pepe/Mis_documentos/Correo/ y después
tar xf /carpeta_de_su_archivo/MisDocs.tar

* Vale, pero si tengo un archivo de 500 Mo y que sólo hay uno o dos ficheros que me interesan, ¡no poe eso voy a desarchivar 500Mo para guardar sólo un o dos ficheros de 30 Ko!

Si por ejemplo, en el archivo /carpeta_de_su_archivo/ MisDocs.tar, hay los ficheros (o directorios) imagen1 y imagen2 que quiere extraer, primero debe conocer sus caminos completos al interior del archivo con la opción t
tar tf /carpeta_de_su_archivo/MisDocs.tar
que va a listar todos los ficheros del archivo con sus caminos. Como es posible que sea largo, puede filtrar con grep haciendo:
tar tf /carpeta_de_su_archivo/MisDocs.tar | grep imagen1 (idem avec imagen2)
Supongamos que encuentre:
Mi_album/Mis_fotos/imagen1 y
Mi_album/Mis_dibujos/imagen2
Haga:
tar xf /carpeta_de_su_archivo/MisDocs.tar Mi_album/Mis_fotos/imagen1 Mi_album/Mis_dibujos/imagen2

Y tar va a extraer *únicamente* esos dos ficheros de este gordo archivo (puede que dure bastante tiempo).

* ¡Vaya! Empieza mal: he intentado extraer el fichero Mi_album/Mis clichés/foto4 y tengo este mensaje de error:

tar: Mi_album/Mis: no se puede encontrar en el archivo.

tar: clichés/foto4: no se puede encontrar en el archivo.

tar: Estatus de error trasladado de errores precendentes.

¡Eso no funciona!

Es debido al espacio (blanco) en "Mis clichés". Dos soluciones: renombre poniendo un guión largo "_" en lugar del espacio. O ponga el nombre entero entre " " así.
tar xf /carpeta_de_su_archivo/MisDocs.tar "Mi_album/Mis clichés/foto4"

He archivado el directorio /home/pepe/Mis_documentos/Mis_imagenes/ en el cual habían "foto1" y "foto2" y leyendo el archivo (opción t) o desarchivándolo (opción x), tengo nombres de ficheros muy largos
/home/pepe/Mis_documentos/Mis_imagenes/foto1 y
/home/pepe/Mis_documentos/Mis_imagenes/foto2
¿No hay manera de conseguir sólo "foto1" y "foto2"?

Basta con meterse en el directorio a archivar haciendo:
cd /home/pepe/Mis_documentos/Mis_imagenes/ después ejecutar:
tar cf /carpeta_de_su_archivo/MisDocs.tar *
* quiere decir todo lo que se encuentra en el directorio de trabajo actual.

Ojo con el uso que hará de esto archivo (sobre todo si contiene numerosos ficheros). Si usted o otra persona, la desarchiva en un cualquier directorio, va a encontrarte con una multitud de ficheros que se van a añadir, y tendrá mucha faena para saber cuales eran los ficheros que estaban ahí al principio. ¡Ánimo! Si encuentra tal archivo, más vale que te meta (con la orden cd) dentro de un directorio vacío. Siempre podrá desplazar sus ficheros.

Así que, resumiendo, si con la orden tar tf, tiene algo parecido:
foto1
foto2
foto3
....
métase en una carpeta vacía, porque todo se va a desarchivar de cualquier manera.
Si tiene algo que se parezca a eso:

album/foto1
album/foto2
album/foto3
....
puede prescindir hacerlo, ya que todo se va a desarchivar en el directorio "album" que se va a crear.

* Cada vez que creo un archivo, tengo este mensaje de error:

tar: Eliminando cabecera '/' de los nombres de miembros

No es un mensaje de error: tar quita el primer / para dar un camino relativo a los ficheros del archivo en vez de darlos un camino absoluto por razón de seguridad. En efecto, imagina que archiva el directorio /etc. En el archivo, tendrá por ejemplo etc/passwd (o /etc/shadow). Durante el archivo, no tiene ninguna incidencia. Durante el desarchivo, en cambio, si tenía /etc/passwd en el archivo, va a sobreescribir el /etc/passwd existente! Vaya catástrofe!

Como tiene etc/passwd, se va a desarchivar en el directorio de trabajo actual (por ejemplo /home/pepe/ lo que dará /home/pepe/etc/passwd). Después, si quiere, podrá poner este fichero en lugar de él que está ya en /etc (suponiendo que sepas lo que hace:). Pero no se hará automáticamente y no a sus espaldas.
Note que es posible invalidar está acción de supresión de los / con la opción -P (lo que puede ser peligroso). Así pues, si desarchiva un fichero .tar, eche un vistazo antes con la opción -t. Si los nombres de los ficheros no empiezan por /, vale; sino, ¡peligro!

Última cosa, para tomar otra vez el ejemplo de etc/passwd, es muy claro que si su directorio de trabajo actual es la raíz (es decir que si hizo un cd / o si la orden pwd le devuelve /, su fichero /etc/passwd original estará sobrescrito por el fichero etc/passwd de su archivo.

Conclusión, antes de desarchivar un fichero tar, vaya en un directorio donde no arriesgue gran cosa: incluso créelo adrede con ocasión con la orden mkdir. Ejemplo:
mkdir /home/pepe/directorio_de_desarchivo
cd /home/pepe/directorio_de_desarchivo
tar xf /carpeta_de_su_archivo/MisDocs.tar

* Si es gordo el archivo (y más aún si está comprimido), la sencilla lectura con tar tf puede ser larga y fastidiosa, en particular si busca un fichero en varios archivos grabados sobre diferentes CDs. Así pues es juicioso de generar un índice que pone en el mismo directorio (o CD) que el archivo mismo. Para hacer este índice:

tar tf /carpeta_de_su_archivo/MisDocs.tar > /carpeta_de_su_archivo/índice_de_MisDocs
* La generación de este índice podrá también servirle para verificar su archivo. Me explico: hace su archivo tar y la ordena al abrigo (después de haberlo grabado sobre un CD). Ahora bien, si tiene un defecto, sólo te dará cuenta el día que necesite recuperar sus datos (por ejemplo si su disco rígido se rompe), es decir demasiado tarde. ¿Cómo verificar así pues su archivo? He encontrado tres maneras:

1. La orden tar tf (tjf si está comprimida por bzip2 y tzf por gzip) le visualizará la lista completa de los ficheros y carpetas archivadas... excepto si el archiva está corrupta. En este caso, el programa tar tf se parará con este mensaje de error siguiente:

"bzip2: Data integrity error when decompressing.
Input file = (stdin), output file = (stdout)
It is possible that the compressed file(s) have become corrupted.
You can use the -tvv option to test integrity of such files.
You can use the `bzip2recover' program to attempt to recover
data from undamaged sections of corrupted files."

Si no tiene este mensaje, es buena señal.

¡Ojo! Este mensaje no va a ser grabado en el índice que hubiera generado con la orden:
tar tf /directorio_de_su_archivo/MisDocs.tar > /directorio_de_su_archivo/índice_de_MisDocs, así pues no se crea tranquilo si no ha visto mensaje de error en el índice.

En efecto, el señal > redirige los mensajes normales (canal estándar) de la orden tar hacía el fichero índice_de_MisDocs, pero no redirige los mensajes de errores (canal de errores). Para redirigir esos últimos, habría que reemplazar > por 2>
Si quiere redirigir los mensajes normales y de errores en el índice, reemplace > par 2&> y ya estará.

2. La orden tar df (djf o dzf) comparará el archivo que acaba de crearse con los ficheros y directorios que acabas de archivar.
Así pues, si acaba de hacer...
tar cf /directorio_de_su_archivo/MisDocs.tar /home/pepe/Mis_documentos

...y si la orden no le devuelve nada, es buena señal. Desde luego, es imprescindible que mientras tanto, no hayan cambiado los datos que archiva (eso es si archiva el directorio escondido de configuración de su administrador de ventanas) conforme lo usa para crear el archivo)

Si tiene este mensaje, en cambio, no es nada bueno:
"bzip2: Data integrity error when decompressing.
Input file = (stdin), output file = (stdout)"

3. El programa de compresión bzip2 puede ser causa de problema (escaso, sin embargo). Verifique su archivo (comprimida) haciendo:
bzip2 -tvv /directorio_de_su_archivo/MisDocs.tar.bz2

Si todo pasa bien, verá una serie de lineas que se parecen a eso:
[1: huff+mtf rt+rld] [2: huff+mtf rt+rld]

Si hay un problema, se parará el programa con este mensaje de error:
[159: huff+mtf rt+rld]data integrity (CRC) error in data

Si las pruebas no son buenas, no vacile: ¡empiece de nuevo!

* Si hace copias de seguridad y quiere además conservar los permisos sobre los ficheros, usa la opción -p (*no* -P, ojo: ver más arriba). Nunca la he probado, pero me parece que está opción -p sólo sirve durante el desarchivo (sería inútil durante el archivo)

Ya está, habría muchas cosas que decir sobre tar, pero ya tiene bastante para divertirte (y no olvide que "man tar" y "info tar" son sus amigos :-).

Este artículo esta sometido a la licencia LGPL. Lo puede copiar, traducir (excepto en francés que es el idioma original) y difundirlo como quiera con la condición de no modificarlo y de dejar intacta la presente noticia.

Fue escrito y traducido con la ayuda de varios miembros de la comunidad del sofware libre que agredezco de paso.

Leave a Reply

Your email address will not be published.