.. index:: tar tar *** Ya se discutió cómo usar :ref:`tar ` en el :ref:`epígrafe dedicado al empaquetado `, pero la intención entonces fue la de explicar cómo usar la herramienta para poco más que hacer copias puntuales del contenido de algún directorio. :command:`tar` puede dar algo más de juego, aunque debemos ser conscientes de sus limitaciones: - El formato surgió para almacenar las copias en cintas magnéticas, cuyo acceso es secuencial. En consecuencia, no hay acceso directo a un contenido determinado, y es forzoso recorrer el paquete hasta llegar a él. - La compresión de las copias no es consustancial a la herramienta, sino que se comprime el paquete. En consecuencia, la extracción de un contenido determinado, exige la descompresión del paquete y recorrerlo hasta llegar a él. - La selección de los archivos a empaquetar es muy limitada, aunque para paliarlo podemos usar :ref:`la técnica de generar la lista de archivos con find `.` Hay, además de lo ya expuesto, dos opciones muy pertinentes en la creación de copias de seguridad: :kbd:`-u`\ [#]_ La opción permite actualizar (**u**\ *pdate*) el paquete añadiendo al final nuevos archivos o archivos modificados. Es importante entender que no se sustituye la versión antigua del archivo, sino que se añade al final. Además, sólo pueden actualizarse archivos **no** comprimidos:: $ mkdir /tmp/KK $ cd /tmp/KK $ echo 1 > numero $ echo a > letra $ tar -cf ../prueba.tar . $ tar -tf ../prueba.tar ./ ./letra ./numero $ echo 2 > numero $ tar -uvf ../prueba.tar . ./numero $ tar -tf ../prueba.tar ./ ./letra ./numero ./numero Ahora bien, los archivos se recuperan en el modo en que se añadieron al paquete\ [#]_, por lo que en una extracción normal, la nueva versión machacará a la antigua y al final del proceso, sólo habremos recuperado la versión más reciente:: $ mkdir /tmp/KK2 $ tar -C /tmp/KK2 ../prueba.tar $ cat /tmp/KK2/letra a $ cat /tmp/KK2/numero 2 Si nuestra intención, es recuperar una versión antigua, tendremos entonces que usar la opción :kbd:`--occurrence` a la que se puede adjuntar con un número la versión del archivo que se quiere rescatar. Si se usa, pero sin número, se entiende que es la primera versión:: $ tar -C /tmp --occurence=1 -xf ../prueba.tar ./numero $ cat /tmp/numero 1 .. note:: :kbd:`occurrence` requiere que se especifique una lista de archivos a extraer. :kbd:`-g ` Puede servirnos para hacer tanto copias *incrementales* como copias *diferenciales*. La opción introduce el nombre del archivo :kbd:`snap` que se toma como referencia al hacer una nueva copia de seguridad. **Copias incrementales** Como en las copias incrementales se guardan los cambios respecto a la última copia, el archivo :kbd:`snap` debe actualizarse con cada copia. Por ejemplo:: $ mkdir /tmp/KK $ echo 1 > /tmp/KK/version Hacemos una copia completa de los datos:: $ tar -C /tmp/KK -acvf copia1c.tar.xz -g info.snap . Tiempo después podemos hacer añadir un archivo y hacer una copia incremental para lo cual debemos tomar como referencia (con :kbd:`-g`) el :kbd:`snap` de la copia anterior:: $ echo a > /tmp/KK/letra.txt $ echo 2 > /tmp/KK/version $ tar -C /tmp/KK -acvf copia1c1i.tar.xz -g info.snap . La copia incremental contendrá :file:`letra.txt` y :file:`version` ya que ha cambiado de contenido. El archivo :kbd:`snap`, además, cambia también y registra el estado en que quedamos al completar la copia incremental. Más adelante podríamos modificar la versión y eliminar el archivo :file:`letra.txt`:: $ echo 3 > /tmp/KK/version $ rm /tmp/KK/letra.txt $ tar -C /tmp/KK -acvf copia1c2i.tar.xz -g info.snap . En esta ocasión el efecto de la copia incremental debería ser modificar :file:`version` y borrar :file:`letra.txt`. Para recuperar las copias debemos ir, cronológicamente, recuperando todas las copias, aunque añadiendo la opción :kbd:`-G` para se tenga en cuenta que las copias han sido incrementales:: $ mkdir /tmp/KK2 $ tar -C /tmp/KK2 -axGvf copia1c.tar.xz $ tar -C /tmp/KK2 -axGvf copia1c1i.tar.xz $ tar -C /tmp/KK2 -axGvf copia1c2i.tar.xz .. note:: El archivo :file:`snap` no se inspecciona al restaurar, así que es absolutamente irrelevante. **Copias diferenciales** En ellas se almacenan todas las modificaciones desde la última copia completa. En consecuencia, la referencia para hacer las copias diferenciales siempre tiene que ser el archivo :file:`snap` generado al hacer la copia completa. Para lograrlo, basta con hacer copiar y usar esta copia como referencia:: $ mkdir /tmp/KK $ echo 1 > /tmp/KK/version $ tar -C /tmp/KK -acvf copia1c.tar.gz -g info.snap . $ echo a > /tmp/KK/letra.txt $ echo 2 > /tmp/KK/version $ cp info.snap temp.snap $ tar -C /tmp/KK -acvf copia1c1d.tar.xz -g temp.snap . $ echo 2 > /tmp/KK/numero.txt $ rm /tmp/KK/letra.txt $ cp info.snap temp.snap $ tar -C /tmp/KK -acvf copia1c2d.tar.xz -g temp.snap . Obviamente, para restaurar sólo hay que usar la copia completa y la última copia diferencial:: $ mkdir /tmp/KK2 $ tar -C /tmp/KK2 -axGvf copia1c.tar.xz $ tar -C /tmp/KK2 -axGvf copia1c2d.tar.xz .. rubric:: Notas al pue .. [#] Existe también la opción :kbd:`-r` que añade indiscriminadamente más archivos al final del paquete. Existiendo la opción :kbd:`-u` que excluirá aquellos archivos ya existentes que no han cambiado, :kbd:`-r` queda sin utilidad. .. [#] Obvio, porque recordemos que el acceso es secuencial.