gzip - ejemplos - descomprimir zip linux terminal
Utilizando multi-núcleo para la compresión/descompresión tar+gzip/bzip (5)
Normalmente comprime usando tar zcvf
y descomprimo usando tar zxvf
(usando gzip debido al hábito).
Recientemente obtuve una CPU de cuatro núcleos con hyperthreading, por lo que tengo 8 núcleos lógicos, y noté que muchos de los núcleos no se utilizan durante la compresión / descompresión.
¿Hay alguna forma de que pueda utilizar los núcleos no utilizados para hacerlo más rápido?
Enfoque común
Hay una opción para el programa tar
:
-I, --use-compress-program PROG
filter through PROG (must accept -d)
Puede usar la versión de múltiples subprocesos de la utilidad de archivador o compresor.
Los archivadores multiproceso más populares son pigz (en lugar de gzip) y pbzip2 (en lugar de bzip2). Por ejemplo:
$ tar -I pbzip2 -cf OUTPUT_FILE.tar.bz2 paths_to_archive
$ tar --use-compress-program=pigz -cf OUTPUT_FILE.tar.gz paths_to_archive
Archiver debe aceptar -d. Si su utilidad de reemplazo no tiene este parámetro y / o necesita especificar parámetros adicionales, entonces use tuberías (agregue parámetros si es necesario):
$ tar cf - paths_to_archive | pbzip2 > OUTPUT_FILE.tar.gz
$ tar cf - paths_to_archive | pigz > OUTPUT_FILE.tar.gz
La entrada y la salida de singlethread y multithread son compatibles. Puede comprimir utilizando la versión multithread y descomprimir utilizando la versión singlethread y viceversa.
p7zip
Para p7zip para la compresión necesita un script de shell pequeño como el siguiente:
#!/bin/sh
case $1 in
-d) 7za -txz -si -so e;;
*) 7za -txz -si -so a .;;
esac 2>/dev/null
Guárdelo como 7zhelper.sh. Aquí el ejemplo de uso:
$ tar -I 7zhelper.sh -cf OUTPUT_FILE.tar.7z paths_to_archive
$ tar -I 7zhelper.sh -xf OUTPUT_FILE.tar.7z
xz
En cuanto al soporte XZ multiproceso. Si está ejecutando la versión 5.2.0 o superior de XZ Utils, puede utilizar múltiples núcleos para compresión configurando -T
o - --threads
en un valor apropiado a través de la variable de entorno XZ_DEFAULTS (por ejemplo, XZ_DEFAULTS="-T 0"
).
Este es un fragmento de hombre para la versión 5.1.0alpha:
La compresión y descompresión multiproceso aún no están implementadas, por lo que esta opción no tiene ningún efecto por el momento.
Sin embargo, esto no funcionará para la descompresión de archivos que tampoco se hayan comprimido con el enhebrado habilitado. De hombre para la versión 5.2.2:
La descompresión roscada no se ha implementado todavía. Solo funcionará en archivos que contengan varios bloques con información de tamaño en encabezados de bloque. Todos los archivos comprimidos en modo de subprocesos múltiples cumplen esta condición, pero los archivos comprimidos en modo de subproceso único no se usan aunque se use --block-size = size.
Recompilación con reemplazo
Si construyes tar desde fuentes, entonces puedes recompilar con parámetros
--with-gzip=pigz
--with-bzip2=lbzip2
--with-lzip=plzip
Después de volver a compilar tar con estas opciones, puede verificar el resultado de la ayuda de tar:
$ tar --help | grep "lbzip2/|plzip/|pigz"
-j, --bzip2 filter the archive through lbzip2
--lzip filter the archive through plzip
-z, --gzip, --gunzip, --ungzip filter the archive through pigz
Puede usar el atajo -I
para el --use-compress-program
tar --use-compress-program
e invocar pbzip2
para la compresión bzip2 en múltiples núcleos:
tar -I pbzip2 -cf OUTPUT_FILE.tar.bz2 DIRECTORY_TO_COMPRESS/
Puedes usar pigz lugar de gzip, que hace compresión gzip en múltiples núcleos. En lugar de usar la opción -z, lo canalizaría a través de pigz:
tar cf - paths-to-archive | pigz > archive.tar.gz
Por defecto, pigz usa la cantidad de núcleos disponibles, u ocho si no puede consultar eso. Puede solicitar más con -pn, por ejemplo, -p 32. pigz tiene las mismas opciones que gzip, por lo que puede solicitar una mejor compresión con -9. P.ej
tar cf - paths-to-archive | pigz -9 -p 32 > archive.tar.gz
Si desea tener más flexibilidad con los nombres de archivo y las opciones de compresión, puede usar:
find /my/path/ -type f -name "*.sql" -o -name "*.log" -exec /
tar -P --transform=''s@/my/path/@@g'' -cf - {} + | /
pigz -9 -p 4 > myarchive.tar.gz
Paso 1: find
find /my/path/ -type f -name "*.sql" -o -name "*.log" -exec
Este comando buscará los archivos que desea archivar, en este caso /my/path/*.sql
y /my/path/*.log
. Agregue tantos -o -name "pattern"
como desee.
-exec
ejecutará el siguiente comando usando los resultados de find
: tar
Paso 2: tar
tar -P --transform=''s@/my/path/@@g'' -cf - {} +
--transform
es un parámetro simple de reemplazo de cadenas. Se quitará la ruta de los archivos del archivo para que la raíz de tarball se convierta en el directorio actual al extraer. Tenga en cuenta que no puede usar la opción -C
para cambiar el directorio ya que perderá los beneficios de find
: se incluirán todos los archivos del directorio.
-P
le dice a tar
que use rutas absolutas, por lo que no activa la advertencia "Eliminando ''/'' de los nombres de los miembros". Liderando ''/'' con ser eliminado por --transform
todos modos.
-cf -
le dice a tar
que use el nombre de tarball que especificaremos más tarde
{} +
usa cada archivo que find
encontrado previamente
Paso 3: pigz
pigz -9 -p 4
Use tantos parámetros como desee. En este caso, -9
es el nivel de compresión y -p 4
es la cantidad de núcleos dedicados a la compresión. Si ejecuta esto en un servidor web cargado, probablemente no desee utilizar todos los núcleos disponibles.
Paso 4: nombre del archivo
> myarchive.tar.gz
Finalmente.
También puede usar el indicador tar "--use-compress-program =" para indicar a tar qué programa de compresión usar.
Por ejemplo uso:
tar -c --use-compress-program=pigz -f tar.file dir_to_zip