Comprimir archivos en Linux: ZIP y algunas cosas que no te esperas

La entrada de hoy versa sobre el programa ZIP, popular programa y formato de compresión. Pero no hablaremos de sus usos más habituales, como la compresión y descompresión. Para ello ya realizamos una entrada al respecto. Hablaremos de otras opciones y como nos pueden ayudar.

El artículo es una adaptación del publicado en Networkworld.com por Sandra Henry-Stocker.

Algunos de nosotros hemos estado comprimiendo archivos en sistemas UNIX y GNU/Linux durante muchas décadas, para así mantener espacio disponible en disco y organizar los ficheros. Aún así, hay algunas variaciones interesantes sobre la compresión que no todos hemos probado. Por lo tanto, en esta publicación, veremos la compresión y descompresión estándar, así como otras opciones interesantes de compresión.

Comprimir archivos den Linux: ZIP y algunas cosas que no te esperas

Uso básico del comando ZIP

Primero, veamos el uso básico del comando zip. Utiliza esencialmente el mismo algoritmo de compresión de gzip, pero hay un par de diferencias importantes. Por un lado, el comando gzip se usa solo para comprimir un solo archivo donde zip puede comprimir archivos y unirlos en un archivo. Por otro lado, el comando gzip se cierra “en su lugar”. En otras palabras, deja un fichero comprimid, no el fichero original, junto con la copia comprimida.

Veamos un ejemplo del uso de gzip:

  1. $ gzip onefile
  2. $ ls -l
  3. -rw-rw-r-- 1 shs shs 10514 Jan 15 13:13 onefile.gz

Y aquí veamos el uso de zip. Observe cómo este comando requiere que se proporcione un nombre para el fichero comprimido donde gzip simplemente utiliza el nombre del fichero original y agrega la extensión “.gz”

  1. $ zip twofiles.zip file*
  2.   adding: file1 (deflated 82%)
  3.   adding: file2 (deflated 82%)
  4. $ ls -l
  5. -rw-rw-r-- 1 shs shs 58021 Jan 15 13:25 file1
  6. -rw-rw-r-- 1 shs shs 58933 Jan 15 13:34 file2
  7. -rw-rw-r-- 1 shs shs 21289 Jan 15 13:35 twofiles.zip

Tenga en cuenta también que los ficheros originales todavía están allí.

La cantidad de espacio en disco que se guarda (es decir, el grado de compresión obtenido) dependerá del contenido de cada fichero. La variación en el seguimiento ejemplo es considerable.

  1. $ zip mybin.zip ~/bin/*
  2.   adding: bin/1 (deflated 26%)
  3.   adding: bin/append (deflated 64%)
  4.   adding: bin/BoD_meeting (deflated 18%)
  5.   adding: bin/cpuhog1 (deflated 14%)
  6.   adding: bin/cpuhog2 (stored 0%)
  7.   adding: bin/ff (deflated 32%)
  8.   adding: bin/file.0 (deflated 1%)
  9.   adding: bin/loop (deflated 14%)
  10.   adding: bin/notes (deflated 23%)
  11.   adding: bin/patterns (stored 0%)
  12.   adding: bin/runme (stored 0%)
  13.   adding: bin/tryme (deflated 13%)
  14.   adding: bin/tt (deflated 6%)

El comando unzip

El comando Unzip recuperará el contenido de un fichero con extensión zip y , como es probable que sospeche, dejará el fichero zip intacto, mientras que un comando gunzip similar dejaría solo fichero sin comprimir.

  1. $ unzip twofiles.zip
  2. Archive:  twofiles.zip
  3.   inflating: file1
  4.   inflating: file2
  5. $ ls -l
  6. -rw-rw-r-- 1 shs shs 58021 Jan 15 13:25 file1
  7. -rw-rw-r-- 1 shs shs 58933 Jan 15 13:34 file2
  8. -rw-rw-r-- 1 shs shs 21289 Jan 15 13:35 twofiles.zip

El comando zipcloak

El comando zipcloak cifra un fichero zip, solicitándole que ingrese una contraseña dos veces (para ayudar a asegurar que no lo haga) y deja el fichero en su lugar. Puede esperar que el tamaño del archivo varíe un poco del original.

  1. $ zipcloak twofiles.zip
  2. Enter password:
  3. Verify password:
  4. encrypting: file1
  5. encrypting: file2
  6. $ ls -l
  7. total 204
  8. -rw-rw-r-- 1 shs shs 58021 Jan 15 13:25 file1
  9. -rw-rw-r-- 1 shs shs 58933 Jan 15 13:34 file2
  10. -rw-rw-r-- 1 shs shs 21313 Jan 15 13:46 twofiles.zip   <== slightly larger than
  11.                                                            unencrypted version

Tenga en cuenta que los archivos originales todavía se encuentran sin cifrar.

El comando zipdetails

El comando zipdetails te mostrará detalles: muchos detalles sobre un fichero comprimido, probablemente mucho más de lo que te interesa absorber. A pesar de que estamos viendo un archivo cifrado, zipdetails muestra los nombres de los ficheros junto con las fechas de modificación del archivo, la información del usuario y del grupo, los datos de la longitud del archivo, etc. Recuerde que esto es todo «metadatos». No vemos el contenido de los archivos.

  1. $ zipdetails twofiles.zip
  2.  
  3. 0000 LOCAL HEADER #1       04034B50
  4. 0004 Extract Zip Spec      14 '2.0'
  5. 0005 Extract OS            00 'MS-DOS'
  6. 0006 General Purpose Flag  0001
  7.      [Bit  0]              1 'Encryption'
  8.      [Bits 1-2]            1 'Maximum Compression'
  9. 0008 Compression Method    0008 'Deflated'
  10. 000A Last Mod Time         4E2F6B24 'Tue Jan 15 13:25:08 2019'
  11. 000E CRC                   F1B115BD
  12. 0012 Compressed Length     00002904
  13. 0016 Uncompressed Length   0000E2A5
  14. 001A Filename Length       0005
  15. 001C Extra Length          001C
  16. 001E Filename              'file1'
  17. 0023 Extra ID #0001        5455 'UT: Extended Timestamp'
  18. 0025   Length              0009
  19. 0027   Flags               '03 mod access'
  20. 0028   Mod Time            5C3E2584 'Tue Jan 15 13:25:08 2019'
  21. 002C   Access Time         5C3E27BB 'Tue Jan 15 13:34:35 2019'
  22. 0030 Extra ID #0002        7875 'ux: Unix Extra Type 3'
  23. 0032   Length              000B
  24. 0034   Version             01
  25. 0035   UID Size            04
  26. 0036   UID                 000003E8
  27. 003A   GID Size            04
  28. 003B   GID                 000003E8
  29. 003F PAYLOAD
  30.  
  31. 2943 LOCAL HEADER #2       04034B50
  32. 2947 Extract Zip Spec      14 '2.0'
  33. 2948 Extract OS            00 'MS-DOS'
  34. 2949 General Purpose Flag  0001
  35.      [Bit  0]              1 'Encryption'
  36.      [Bits 1-2]            1 'Maximum Compression'
  37. 294B Compression Method    0008 'Deflated'
  38. 294D Last Mod Time         4E2F6C56 'Tue Jan 15 13:34:44 2019'
  39. 2951 CRC                   EC214569
  40. 2955 Compressed Length     00002913
  41. 2959 Uncompressed Length   0000E635
  42. 295D Filename Length       0005
  43. 295F Extra Length          001C
  44. 2961 Filename              'file2'
  45. 2966 Extra ID #0001        5455 'UT: Extended Timestamp'
  46. 2968   Length              0009
  47. 296A   Flags               '03 mod access'
  48. 296B   Mod Time            5C3E27C4 'Tue Jan 15 13:34:44 2019'
  49. 296F   Access Time         5C3E27BD 'Tue Jan 15 13:34:37 2019'
  50. 2973 Extra ID #0002        7875 'ux: Unix Extra Type 3'
  51. 2975   Length              000B
  52. 2977   Version             01
  53. 2978   UID Size            04
  54. 2979   UID                 000003E8
  55. 297D   GID Size            04
  56. 297E   GID                 000003E8
  57. 2982 PAYLOAD
  58.  
  59. 5295 CENTRAL HEADER #1     02014B50
  60. 5299 Created Zip Spec      1E '3.0'
  61. 529A Created OS            03 'Unix'
  62. 529B Extract Zip Spec      14 '2.0'
  63. 529C Extract OS            00 'MS-DOS'
  64. 529D General Purpose Flag  0001
  65.      [Bit  0]              1 'Encryption'
  66.      [Bits 1-2]            1 'Maximum Compression'
  67. 529F Compression Method    0008 'Deflated'
  68. 52A1 Last Mod Time         4E2F6B24 'Tue Jan 15 13:25:08 2019'
  69. 52A5 CRC                   F1B115BD
  70. 52A9 Compressed Length     00002904
  71. 52AD Uncompressed Length   0000E2A5
  72. 52B1 Filename Length       0005
  73. 52B3 Extra Length          0018
  74. 52B5 Comment Length        0000
  75. 52B7 Disk Start            0000
  76. 52B9 Int File Attributes   0001
  77.      [Bit 0]               1 Text Data
  78. 52BB Ext File Attributes   81B40000
  79. 52BF Local Header Offset   00000000
  80. 52C3 Filename              'file1'
  81. 52C8 Extra ID #0001        5455 'UT: Extended Timestamp'
  82. 52CA   Length              0005
  83. 52CC   Flags               '03 mod access'
  84. 52CD   Mod Time            5C3E2584 'Tue Jan 15 13:25:08 2019'
  85. 52D1 Extra ID #0002        7875 'ux: Unix Extra Type 3'
  86. 52D3   Length              000B
  87. 52D5   Version             01
  88. 52D6   UID Size            04
  89. 52D7   UID                 000003E8
  90. 52DB   GID Size            04
  91. 52DC   GID                 000003E8
  92.  
  93. 52E0 CENTRAL HEADER #2     02014B50
  94. 52E4 Created Zip Spec      1E '3.0'
  95. 52E5 Created OS            03 'Unix'
  96. 52E6 Extract Zip Spec      14 '2.0'
  97. 52E7 Extract OS            00 'MS-DOS'
  98. 52E8 General Purpose Flag  0001
  99.      [Bit  0]              1 'Encryption'
  100.      [Bits 1-2]            1 'Maximum Compression'
  101. 52EA Compression Method    0008 'Deflated'
  102. 52EC Last Mod Time         4E2F6C56 'Tue Jan 15 13:34:44 2019'
  103. 52F0 CRC                   EC214569
  104. 52F4 Compressed Length     00002913
  105. 52F8 Uncompressed Length   0000E635
  106. 52FC Filename Length       0005
  107. 52FE Extra Length          0018
  108. 5300 Comment Length        0000
  109. 5302 Disk Start            0000
  110. 5304 Int File Attributes   0001
  111.      [Bit 0]               1 Text Data
  112. 5306 Ext File Attributes   81B40000
  113. 530A Local Header Offset   00002943
  114. 530E Filename              'file2'
  115. 5313 Extra ID #0001        5455 'UT: Extended Timestamp'
  116. 5315   Length              0005
  117. 5317   Flags               '03 mod access'
  118. 5318   Mod Time            5C3E27C4 'Tue Jan 15 13:34:44 2019'
  119. 531C Extra ID #0002        7875 'ux: Unix Extra Type 3'
  120. 531E   Length              000B
  121. 5320   Version             01
  122. 5321   UID Size            04
  123. 5322   UID                 000003E8
  124. 5326   GID Size            04
  125. 5327   GID                 000003E8
  126.  
  127. 532B END CENTRAL HEADER    06054B50
  128. 532F Number of this disk   0000
  129. 5331 Central Dir Disk no   0000
  130. 5333 Entries in this disk  0002
  131. 5335 Total Entries         0002
  132. 5337 Size of Central Dir   00000096
  133. 533B Offset to Central Dir 00005295
  134. 533F Comment Length        0000
  135. Done

El comando zipgrep

El comando zipgrep usará una función de tipo grep para localizar contenido particular en sus archivos comprimidos. Si el archivo está cifrado, deberá ingresar la contraseña provista para el cifrado de cada archivo que desee examinar. Si solo desea verificar el contenido de un solo fichero del archivo comprimido, agregue su nombre al final del comando zipgrep como se muestra a continuación.

  1. $ zipgrep hazard twofiles.zip file1
  2. [twofiles.zip] file1 password:
  3. Certain pesticides should be banned since they are hazardous to the environment.

El comando zipinfo

El comando zipinfo proporciona información sobre el contenido de un archivo comprimido, ya sea cifrado o no. Esto incluye los nombres de archivos, tamaños, fechas y permisos.

  1. $ zipinfo twofiles.zip
  2. Archive:  twofiles.zip
  3. Zip file size: 21313 bytes, number of entries: 2
  4. -rw-rw-r--  3.0 unx    58021 Tx defN 19-Jan-15 13:25 file1
  5. -rw-rw-r--  3.0 unx    58933 Tx defN 19-Jan-15 13:34 file2
  6. 2 files, 116954 bytes uncompressed, 20991 bytes compressed:  82.1%

El comando zipnote

Si hablamos de zipnote, vemos que se puede utilizar para extraer comentarios de archivos zip o agregarlos. Para mostrar los comentarios, simplemente inicie el nombre del archivo con el comando. Si no se han agregado comentarios anteriormente, verá algo como esto:

  1. $ zipnote twofiles.zip
  2. @ file1
  3. @ (comment above this line)
  4. @ file2
  5. @ (comment above this line)
  6. @ (zip file comment below this line)

Si desea agregar comentarios, escriba la salida del comando zipnote en un archivo:

  1. $ zipnote twofiles.zip > comments

A continuación, edite el fichero que acaba de crear e inserte sus comentarios sobre las líneas (comentarios sobre esta línea). Luego agrega los comentarios usando un comando zipnote como este:

  1. $ zipnote -w twofiles.zip < comments

El comando zipsplit

El comando zipsplit se puede usar para dividir un fichero zip en múltiples archivos zip, cuando el archivo original es demasiado grande, tal vez porque está intentando agregar uno de los archivos a una pequeña unidad de almacenamiento. La forma más fácil de hacer esto parece ser especificar el tamaño máximo para cada una de las partes del archivo comprimido. Este tamaño debe ser lo suficientemente grande para acomodar el archivo incluido más grande.

  1. $ zipsplit -n 12000 twofiles.zip
  2. 2 zip files will be made (100% efficiency)
  3. creating: twofile1.zip
  4. creating: twofile2.zip
  5. $ ls twofile*.zip
  6. -rw-rw-r-- 1 shs shs  10697 Jan 15 14:52 twofile1.zip
  7. -rw-rw-r-- 1 shs shs  10702 Jan 15 14:52 twofile2.zip
  8. -rw-rw-r-- 1 shs shs  21377 Jan 15 14:27 twofiles.zip

Observe cómo los archivos extraídos se denominan secuencialmente «twofile1» y «twofile2».

Conclusión

El comando zip, junto con algunos de otros programas similares, proporcionan un gran control sobre cómo generar y trabajar con archivos comprimidos.

Espero que el artículo os haya parecido de interés.