¿Puedo comprimir una carpeta completa usando gzip?

407

Estoy tratando de comprimir una carpeta en Unix. ¿Se puede hacer eso usando el comando gzip?

usuario1269502
fuente
66
puede usar el gzip -r myfoldercual gzip los archivos de forma recursiva. De la misma manera, puede descomprimir archivos utilizando los gunzip -r myfolder que descomprimirá archivos de forma recursiva. Para más información, man gzip
Valentin Bajrami
12
Uso tar; Admite opciones de compresión. gzipestá diseñado como un complemento tar, no como un reemplazo.
devnull 01 de
13
Tenga en cuenta que la sugerencia de @ val0x00ff es casi seguro que no es lo que desea lograr.
Shadur 01 de
44
@Shadur por eso lo publiqué commentya que esa no era la respuesta a su pregunta.
Valentin Bajrami
2
Para demostrar lo que significa @Shadur. Archivos dados 1y 2bajo carpeta playground. gzip -r ./playgroundle dará 1.gzy 2.gz(y no más 1y 2archivos) en la carpeta playground, NO un archivo comprimido con todo lo que contiene.
Jeff Xiao

Respuestas:

660

No.

A diferencia zip, gzipfunciona como un algoritmo de compresión única .

Debido a diversas razones, algunas de las cuales evocan a la era de las unidades de cinta, Unix utiliza un programa llamado tarpara archivar datos, que luego puede ser comprimido con un programa de compresión como gzip, bzip2, 7zip, etc.

Para "comprimir" un directorio, el comando correcto sería

tar -zcvf archive.tar.gz directory/ 

Esto le dirá tara

  • comprimirlo usando el algoritmo z (gzip)

  • c (crear) un archivo de los archivos en directory( tares recursivo por defecto)

  • v (verbosely) list (en / dev / stderr para que no afecte los comandos canalizados) todos los archivos que agrega al archivo.

  • y almacenar la salida como un f (archivo) llamadoarchive.tar.gz

El tarcomando ofrece gzipsoporte (a través de la -zbandera) únicamente para su conveniencia. El gzipcomando / lib está completamente separado. El comando anterior es efectivamente el mismo que

tar -cv directory | gzip > archive.tar.gz

Para descomprimir y descomprimir el archivo en el directorio actual que usaría

tar -zxvf archive.tar.gz

Ese comando es efectivamente el mismo que

gunzip < archive.tar.gz | tar -xv

tartiene muchas, muchas, MUCHAS otras opciones y usos también; Recomiendo leer su página de manual en algún momento.

Shadur
fuente
51
Solo para hacer las cosas aún más explícitas, esto es exactamente equivalente tar -cv directory | gzip > archive.tar.gz. El archivo resultante se puede extraer con tar -zxvfo incluso zcat file.tar.gz | tar -xv. Señale que el tar es completamente independiente del gzip, el tarcomando solo incluye soporte gzip para mayor comodidad.
Patrick
He estado usando tar cvzfdurante bastante tiempo. Una cosa a tener en cuenta: si usa Windows ( 7-zippara especificar) para descomprimir un *.tar.gzarchivo, se necesitan dos rondas. Uno para descomprimir el *.tar.gzarchivo en un *.tararchivo, el siguiente para descomprimir ese archivo tar en el contenido original. aumenta el tiempo total de descompresión, especialmente para archivos grandes (por ejemplo, registros)
Jeff Xiao
1
¿La denominación del archivo afecta algo relacionado con la máquina? Sé que sería bueno que las personas conocieran el algoritmo utilizado originalmente para comprimirlo (por lo tanto, .gz), pero aparte de eso, ¿importa realmente cómo se nombra el archivo?
hello_there_andy
3
@hello_there_andy No hay diferencia para la mayoría de los Unix, pero Windows (y la finalización de la pestaña inteligente en Linux) harán suposiciones basadas en la extensión del nombre de archivo.
Shadur
1
@vadimkotov Esto podría ser lo que estás buscando: superuser.com/questions/168749/...
Shadur
47

El gzipcomando no comprimirá recursivamente un directorio en un solo archivo zip, cuando use el -rinterruptor. Más bien, caminará por esa estructura de directorios y comprimirá cada archivo que encuentre en un archivo separado.

Ejemplo

antes de

$ tree dir1/
dir1/
|-- dir11
|   |-- file11
|   |-- file12
|   `-- file13
|-- file1
|-- file2
`-- file3

ahora ejecuta el gzipcomando

$ gzip -r dir1

después

$ tree dir1/
dir1/
|-- dir11
|   |-- file11.gz
|   |-- file12.gz
|   `-- file13.gz
|-- file1.gz
|-- file2.gz
`-- file3.gz

Si prefiere comprimir la estructura del directorio, es probable que desee utilizar el tarcomando y luego comprimir el .tararchivo resultante .

$ tar zcvf dir1.tar.gz dir1/

Ejemplo

$ tar zcvf dir1.tar.gz dir1/
dir1/
dir1/file1
dir1/file2
dir1/dir11/
dir1/dir11/file11.gz
dir1/dir11/file12.gz
dir1/dir11/file13.gz
dir1/file3

Lo que da como resultado el siguiente archivo único:

$ ls -l | grep tar
-rw-rw-r-- 1 saml saml  271 Oct  1 08:07 dir1.tar.gz

Puedes confirmar su contenido:

$ tar ztvf dir1.tar.gz 
drwxrwxr-x saml/saml         0 2013-10-01 08:05 dir1/
-rw-rw-r-- saml/saml         0 2013-10-01 07:45 dir1/file1
-rw-rw-r-- saml/saml         0 2013-10-01 07:45 dir1/file2
drwxrwxr-x saml/saml         0 2013-10-01 08:04 dir1/dir11/
-rw-rw-r-- saml/saml        27 2013-10-01 07:45 dir1/dir11/file11.gz
-rw-rw-r-- saml/saml        27 2013-10-01 07:45 dir1/dir11/file12.gz
-rw-rw-r-- saml/saml        27 2013-10-01 07:45 dir1/dir11/file13.gz
-rw-rw-r-- saml/saml         0 2013-10-01 07:45 dir1/file3
slm
fuente
4

Escribí estos 2 comandos:

gzipdir:

#!/bin/bash
if [[ -d $1 ]]; then
    cd "$1"
    cd ..
    base=$(basename "$1")
    tar -zcvf "$base.tgz" "$base"
    if [[ $? == 0 && -f "$base.tgz" ]]; then
        rm -rf "$base"
    fi
else
    echo "Usage: $0 DIRECTORY";
fi

ungzipdir:

#!/bin/bash
if [[ -f $1 ]]; then
    base=${1%%.*}
    file=$(basename "$1");
    dir=$(basename "$base");
    if [[ ! -d $base ]]; then
        mkdir "$base"
        cd "$base"
        cd ..
        tar -xvf "$file"
        if [[ $? == 0 && -d "$dir" ]]; then
            rm -f "$file"
        fi
    else
        echo "Directory $base already exists. Nothing done."
    fi
else
    echo "Usage: $0 file.tgz";
fi

(!!!) Por favor, pruebe antes de usar (ya que hay una 'rm -f' que podría eliminar datos importantes si se usa de manera poco común).

Cómo utilizar:

cd /home/; gzipdir MyDirectory o gzipdir /home/MyDirectory

Creará /home/MyDirectory.tgz y eliminará MyDirectory en caso de éxito (!!!).

ungzipdir /home/MyDirectory.tgz

Creará / home / MyDirectory y eliminará /home/MyDirectory.tgz en caso de éxito.

lepe
fuente
Para comprimir TODOS los archivos en un directorio: find ./* -maxdepth 0 -type d -exec gzipdir {} \; (tenga cuidado con el comando find, pruébelo -exec echo {}primero y asegúrese de que no está capturando './' que comprimirá el directorio de PADRES, posiblemente rompiendo todo su directorio de inicio)
Andrew Lorien
1

Recomiendo usar pigz( Implementación paralela de GZip )

tar -cvf - dir | pigz -9 > /path/to/dir.tar.gz

nyxee
fuente
También lo uso mucho (y pixz), pero ¿funciona cuando las tuberías y la redirección de salida entran en juego?
Michael Wolf
1

La respuesta a la pregunta "¿Puedo comprimir una carpeta completa usando zip en linux?" Es usar la sintaxis:

zip -r <zip file name> <folder to zip>
ize
fuente
Si tiene una nueva pregunta, hágala haciendo clic en el botón Hacer pregunta . Incluya un enlace a esta pregunta si ayuda a proporcionar contexto. - De la opinión
Jeff Schaller
2
@JeffSchaller: Esta es una respuesta. Es un error grave (creo), pero claramente es una respuesta.
Scott
1
@ize: estoy bastante seguro de que el comando que publicó no utiliza, de hecho, gzip.
dhag
1
Puntos por usar zip como la pregunta formulada, lo más probable es que al autor le hubiera gustado saber que es posible HACER LO MISMO EXACTO que solía hacer en Windows. Es triste que la mayoría de la gente no quiera pensar tan lejos.
Florian Heigl
2
Es complicado cuando la pregunta especifica ... "usando gzip".
Jeff Schaller
1

Para completar, si desea tar el archivo en segundo plano, use la respuesta de @ Shadur y agregue &al final:

tar -zcvf archive.tar.gz directory/ &
shiramy
fuente
0

Si su tar de Linux no admite la -zopción, puede usar lo siguiente:

tar -cvf - dir | gzip > dir.tar.gz
Jeff
fuente