Supongamos que tengo 10,000 archivos XML. Ahora supongamos que quiero enviárselos a un amigo. Antes de enviarlos, me gustaría comprimirlos.
Método 1: no comprimirlos
Resultados:
Resulting Size: 62 MB
Percent of initial size: 100%
Método 2: comprime cada archivo y envíale 10,000 archivos xml
Mando:
for x in $(ls -1) ; do echo $x ; zip "$x.zip" $x ; done
Resultados:
Resulting Size: 13 MB
Percent of initial size: 20%
Método 3: crear un único zip que contenga 10,000 archivos xml
Mando:
zip all.zip $(ls -1)
Resultados:
Resulting Size: 12 MB
Percent of initial size: 19%
Método 4: Concatenar los archivos en un solo archivo y comprimirlo
Mando:
cat *.xml > oneFile.txt ; zip oneFile.zip oneFile.txt
Resultados:
Resulting Size: 2 MB
Percent of initial size: 3%
Preguntas:
- ¿Por qué obtengo resultados tan dramáticamente mejores cuando solo estoy comprimiendo un solo archivo?
- Esperaba obtener resultados drásticamente mejores con el método 3 que con el método 2, pero no lo hago. ¿Por qué?
- ¿Es específico este comportamiento
zip
? Si lo intentaragzip
, ¿obtendría resultados diferentes?
Información adicional:
$ zip --version
Copyright (c) 1990-2008 Info-ZIP - Type 'zip "-L"' for software license.
This is Zip 3.0 (July 5th 2008), by Info-ZIP.
Currently maintained by E. Gordon. Please send bug reports to
the authors using the web page at www.info-zip.org; see README for details.
Latest sources and executables are at ftp://ftp.info-zip.org/pub/infozip,
as of above date; see http://www.info-zip.org/ for other sites.
Compiled with gcc 4.4.4 20100525 (Red Hat 4.4.4-5) for Unix (Linux ELF) on Nov 11 2010.
Zip special compilation options:
USE_EF_UT_TIME (store Universal Time)
SYMLINK_SUPPORT (symbolic links supported)
LARGE_FILE_SUPPORT (can read and write large files on file system)
ZIP64_SUPPORT (use Zip64 to store large files in archives)
UNICODE_SUPPORT (store and read UTF-8 Unicode paths)
STORE_UNIX_UIDs_GIDs (store UID/GID sizes/values using new extra field)
UIDGID_NOT_16BIT (old Unix 16-bit UID/GID extra field not used)
[encryption, version 2.91 of 05 Jan 2007] (modified for Zip 3)
Editar: metadatos
Una respuesta sugiere que la diferencia son los metadatos del sistema que se almacenan en el archivo zip. No creo que este pueda ser el caso. Para probar, hice lo siguiente:
for x in $(seq 10000) ; do touch $x ; done
zip allZip $(ls -1)
El zip resultante es 1.4MB. Esto significa que todavía hay ~ 10 MB de espacio inexplicable.
$(ls -1)
, simplemente use *
: for x in *
; zip all.zip *
.tar.gz
en lugar de simplemente comprimir todo el directorio.