lunes, 30 de mayo de 2016

zip

El programa zip es tanto una herramienta de compresión como de empaquetado. El formato de archivo usado por el programa es familiar para los usuarios de Windows, ya que lee y escribe archivos .zip. En Linux, sin embargo, gzip es el programa de compresión predominante con bzip2 en un cercano segundo lugar.

En su uso más básico, zip se invoca así:

zip opciones archivozip archivo...

Por ejemplo, para hacer un archivo zip de nuestro patio de juegos, haríamos ésto:

[me@linuxbox ~]$ zip -r playground.zip playground

A menos que incluyamos la opción -r para recursividad, sólo se almacenará el directorio playground (pero no su contenido). Aunque la extensión .zip se añade automáticamente, la indicaremos por claridad.

Durante la creación del archivo zip, zip normalmente mostrará una serie de mensajes como éstos:

adding: playground/dir-020/file-Z (stored 0%)
adding: playground/dir-020/file-Y (stored 0%)
adding: playground/dir-020/file-X (stored 0%)
adding: playground/dir-087/ (stored 0%)
adding: playground/dir-087/file-S (stored 0%)

Estos mensajes muestran el estado de cada archivo añadido al paquete. zip añadirá archivos al paquete usando uno de estos dos métodos de almacenamiento: O "almacenará" un archivo sin compresión, como hemos visto aquí, o "reducirá" el archivo realizando compresión. El valor numérico mostrado tras el método de almacenamiento indica la cantidad de compresión realizada. Como nuestro patio de juegos sólo contiene archivos vacíos, no se realizará ninguna compresión de su contenido.

Extraer el contenido de un zip es sencillo cuando usamos el programa unzip:

[me@linuxbox ~]$ cd foo
[me@linuxbox foo]$ unzip ../playground.zip

Una cosa a tener en cuenta sobre zip (al contrario que en tar) es que si se especifica un archivo existente, se actualiza en vez de reemplazarse. Ésto significa que el archivo existente se conserva, pero los archivos nuevos se añaden y los coincidentes se reemplazan.

Los archivos pueden listarse y extraerse selectivamente de un archivo zip especificándolo a unzip:

[me@linuxbox ~]$ unzip -l playground.zip playground/dir-087/file-Z
Archive: ../playground.zip
 Length    Date   Time  Name
--------   ----   ----  ----
       0 10-05-08 09:25 playground/dir-087/file-Z
--------                -------
       0                1 file
[me@linuxbox ~]$ cd foo
[me@linuxbox foo]$ unzip ../playground.zip playground/dir-087/file-Z
Archive: ../playground.zip
replace playground/dir-087/file-Z? [y]es, [n]o, [A]ll, [N]one, [r]ename: y
extracting: playground/dir-087/file-Z

Usar la opción -l hace que unzip sólo liste el contenido de un paquete sin extraer nada. Si no se especifican archivos, unzip listará todos los archivos del paquete. La opción -v puede añadirse para aumentar la información del listado. Fíjate que cuando la extracción del paquete entra en conflicto con un archivo existente, el usuario es preguntado antes de que el archivo sea reemplazado.

Como tar, zip puede hacer uso de la entrada y la salida estándar, aunque su implementación no es tan útil. Es posible canalizar una lista de nombres de archivo a zip con la opción -@:

[me@linuxbox foo]$ cd
[me@linuxbox ~]$ find playground -name "file-A" | zip -@ file-A.zip

Aquí usamos find para generar una lista de archivos coincidentes con el test -name "file-A", y luego canalizamos la lista en zip, lo que crea el paquete file-A.zip que contiene los archivos seleccionados.

zip también soporta escribir su salida a la salida estándar, pero su uso es limitado porque muy pocos programas pueden hacer uso de la salida. Desafortunadamente, el programa unzip no acepta entrada estándar. Ésto impide que zip y unzip se usen juntos para realizar copiado de archivos en red como tar.

zip puede, sin embargo, aceptar entrada estándar, así que puede usarse para comprimir la salida de otros programas:

[me@linuxbox ~]$ ls -l /etc/ | zip ls-etc.zip -
adding: - (deflated 80%)

En este ejemplo canalizamos la salida de ls en zip. Al igual que tar, zip interpreta el guión final como "usa la entrada estándar para el archivo de entrada."

El programa unzip permite que su salida se envíe a la salida estándar cuando se especifica la opción -p (para canalizar):

[me@linuxbox ~]$ unzip -p ls-etc.zip | less

Hemos visto algunas de las cosas básicas que puede hacer zip/unzip. Ambos tienen un montón de opciones que aumentan su flexibilidad, aunque algunas son específicas para plataformas de otros sistemas. Las man pages de zip y unzip son muy buenas y contienen ejemplos útiles. Sin embargo, el uso principal de estos programas es el intercambio de archivos con sistemas Windows, en lugar de comprimir y empaquetar en Linux, donde tar y gzip son claramente preferidos.

No hay comentarios:

Publicar un comentario