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

Comentarios

  • puedes usar gzip -r myfolder que hará gzip de archivos de forma recursiva. De la misma manera que puedes descomprimir archivos usando gunzip -r myfolder que descomprimirá los archivos de forma recursiva. Para obtener más información, man gzip
  • Use tar; admite opciones de compresión . gzip está diseñado como un complemento de tar, no como un reemplazo.
  • Tenga en cuenta que @ val0x00ff ‘ es casi seguro que la sugerencia de

no es lo que quieres lograr.

  • @Shadur que ‘ s por qué lo publiqué como comment ya que esa no era la respuesta a su pregunta.
  • Para demostrar lo que significa @Shadur. Archivos dados 1 y 2 en la carpeta playground . gzip -r ./playground le dará 1.gz y 2.gz (y no más 1 y 2 archivos) en la carpeta playground, NO un archivo comprimido con todo lo que contiene.
  • Respuesta

    No.

    A diferencia de zip, gzip funciona como un algoritmo de compresión solo .

    Debido a varias razones, algunas de las cuales se remontan a la era de las unidades de cinta, Unix usa un programa llamado tar para archivar datos, que luego se pueden comprimir con un programa de compresión como gzip, bzip2, 7zip, etc.

    En para «comprimir» un directorio, el comando correcto sería

    tar -zcvf archive.tar.gz directory/ 

    Esto le indicará a tar que

    • comprimirlo usando el algoritmo z (gzip)

    • c (crear) un archivo a partir de los archivos en directory (tar es recursivo de forma predeterminada)

    • v (detalladamente) lista (en / dev / stderr por lo que no afecta a los comandos canalizados) todos los archivos que agrega al archivo.

    • y almacena la salida como f (archivo) llamado archive.tar.gz

    El comando tar ofrece gzip compatibilidad (a través del indicador -z) únicamente para su conveniencia . El gzip comando / lib es completamente independiente. 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, usaría

    tar -zxvf archive.tar.gz 

    Ese comando es efectivamente el mismo que

    gunzip < archive.tar.gz | tar -xv 

    tar tiene muchos, muchas, MUCHAS otras opciones y usos también; Recomiendo encarecidamente leer su página de manual alguna vez.

    Comentarios

    • Solo para hacer las cosas aún más explícitas, esto es exactamente equivalente a tar -cv directory | gzip > archive.tar.gz. El archivo resultante se puede extraer con tar -zxvf o incluso zcat file.tar.gz | tar -xv. Dado que el tar es completamente independiente del gzip, el comando tar solo incluye compatibilidad con gzip para mayor comodidad.
    • He estado usando tar cvzf durante bastante tiempo. una cosa a tener en cuenta: si usa Windows (7-zip por especificar) para descomprimir un archivo *.tar.gz, se necesitan dos rondas. Uno para descomprimir el archivo *.tar.gz en un archivo *.tar, 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).
    • ¿El nombre del archivo afecta a algo relacionado con la máquina? Sé que sería bueno que la gente supiera el algoritmo que se usó originalmente para comprimirlo (de ahí .gz), pero aparte de eso, ¿realmente importa cómo se nombre el archivo?
    • @hello_there_andy No hace diferencia con la mayoría de los sistemas unix, pero Windows (y la finalización inteligente de pestañas en Linux) hará suposiciones basadas en la extensión del nombre de archivo.
    • @vadimkotov Esto podría ser lo que ‘ re buscando: superuser.com/questions/168749/…

    Responder

    El comando gzip no comprimirá de forma recursiva un directorio en un solo archivo zip, cuando se utiliza el -r conmutador. Más bien, recorrerá esa estructura de directorios y comprimirá cada archivo que encuentre en un archivo separado.

    Ejemplo

    antes

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

    ahora ejecute gzip comando

    $ 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, probablemente desee utilizar el comando tar y luego comprimir el .tar archivo.

    $ 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 

    Puede 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 

    Respuesta

    La respuesta a la pregunta «¿Puedo comprimir una carpeta completa usando gzip [en linux]?» es que puede usar el programa zip en lugar de gzip, con la sintaxis:

    zip -r <zip file name> <folder to zip> 

    Comentarios

    • @JeffSchaller: Esta es una respuesta. Es gravemente incorrecto (creo), pero claramente es una respuesta.
    • @ize: Yo ‘ estoy bastante seguro de que el comando que publicó no lo hace, de hecho, use gzip.
    • Puntos por usar zip como la pregunta formulada, lo más probable es que al autor le hubiera gustado saber ‘ s posible HACER LO EXACTO LO MISMO que solía hacer en las ventanas. Es triste que la mayoría de la gente no ‘ desee pensar tan lejos.
    • Es complicado cuando la pregunta especifica … «usando gzip».
    • ‘ estoy votando a favor de esta respuesta porque creo que el producto (un archivo zip) es probablemente más importante que el método (usando gzip).

    Respuesta

    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 un «rm -f» que podría eliminar datos importantes si se usa de una manera poco común).

    Cómo usar:

    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.

    Comentarios

    • Para comprimir TODOS los archivos en un directorio: find ./* -maxdepth 0 -type d -exec gzipdir {} \; (tenga cuidado con el comando de búsqueda, pruébelo con -exec echo {} primero, y asegúrese de ‘ no capturar ‘ ./’ que comprimirá el directorio de PADRES, posiblemente rompiendo todo su directorio de inicio)

    Respuesta

    Recomiendo usar pigz ( Implementación paralela de GZip )

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

    Comentarios

    • Yo también lo uso mucho (y pixz), pero ¿funciona cuando entran en juego las canalizaciones y la redirección de salida?

    Responder

    Si su tar de Linux no es compatible con la opción -z puede usar lo siguiente:

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

    Responder

    Para completar, si quiero tar el archivo en el bac kground, usa la respuesta de @Shadur y agrega & al final:

    tar -zcvf archive.tar.gz directory/ & 

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *