Estoy intentando comprimir una carpeta en Unix. ¿Se puede hacer usando el comando gzip?
Comentarios
no es lo que quieres lograr.
comment
ya que esa no era la respuesta a su pregunta. 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 contar -zxvf
o inclusozcat file.tar.gz | tar -xv
. Dado que el tar es completamente independiente del gzip, el comandotar
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/ &
gzip -r myfolder
que hará gzip de archivos de forma recursiva. De la misma manera que puedes descomprimir archivos usandogunzip -r myfolder
que descomprimirá los archivos de forma recursiva. Para obtener más información,man gzip
tar
; admite opciones de compresión .gzip
está diseñado como un complemento detar
, no como un reemplazo.