Cómo comprimir todos los archivos en todos los subdirectorios en un archivo comprimido en bash

201

Posible duplicado:
compilar un conjunto de directorios y crear un archivo comprimido de tar

Esta publicación describe cómo comprimir cada archivo individualmente dentro de una estructura de directorio. Sin embargo, necesito hacer algo un poco diferente. Necesito producir un gran archivo gzip para todos los archivos en un determinado directorio. También necesito poder especificar el nombre de archivo de salida para el archivo comprimido (p. Ej., Files.gz) y sobrescribir el antiguo archivo comprimido si ya existe uno.

Doug
fuente
gzippor su propia naturaleza, comprime un solo archivo. Para colocar varios archivos en un solo archivo para su posterior gzipping, use tar.
Thomas

Respuestas:

387
tar -zcvf compressFileName.tar.gz folderToCompress

todo en folderToCompress irá a compressFileName

Editar: Después de la revisión y los comentarios, me di cuenta de que las personas pueden confundirse con compressFileName sin una extensión. Si lo desea, puede usar la extensión .tar.gz (como se sugiere) con el nombre del archivo comprimido.

amitchhajer
fuente
2
Gracias. ¿Comprimirá esto todo en "folderToCompress" (es decir, recursivamente)?
Doug
2
todo en folderToCompress irá a compressFileName
amitchhajer
80
Probablemente quieras elegir compressFileNamepara que incluya la .tar.gzextensión o volverás locos a todos los demás.
2013
9
Esto también funciona para un número arbitrario de directorios, por ejemplo tar -zcvf two-dirs.tar.gz dir-one dir-two, creará un archivo que contiene dos directorios.
Zoltán
55
También funciona *para comprimir todo en el directorio actual, es decir:tar -zcvf all.tar.gz *
61

Hay muchos métodos de compresión que funcionan de forma recursiva en la línea de comandos y es bueno saber quién es el público final.

es decir, si se va a enviar a alguien que ejecute Windows, entonces zip probablemente sería mejor:

zip -r file.zip folder_to_zip

unzip filenname.zip

para otros usuarios de Linux o tu auto alquitrán es genial

tar -cvzf filename.tar.gz folder

tar -cvjf filename.tar.bz2 folder  # even more compression

#change the -c to -x to above to extract

Hay que tener cuidado con el alquitrán y cómo se alquilan / extraen las cosas, por ejemplo, si ejecuto

cd ~
tar -cvzf passwd.tar.gz /etc/passwd
tar: Removing leading `/' from member names
/etc/passwd


pwd

/ home / myusername

tar -xvzf passwd.tar.gz

esto creará / home / myusername / etc / passwd

no estoy seguro si todas las versiones de tar hacen esto:

 Removing leading `/' from member names
VH
fuente
18

La publicación de @amitchhajer funciona para GNU tar. Si alguien encuentra esta publicación y la necesita para funcionar en un GNUsistema NO , puede hacer esto:

tar cvf - folderToCompress | gzip > compressFileName

Para expandir el archivo:

zcat compressFileName | tar xvf -
Jeremy J Starcher
fuente
2
Además de ser portátil, esta solución es útil si desea pasar argumentos a gzip (por ejemplo, --test o --best), ya que afaik incluso GNU tar no proporciona una forma de enviar argumentos a gzip.
Timothy Woods el
Esto es versátil, ya que también puede usar otros compresores. Por ejemplo, pigzque es más rápido, ya que puede utilizar mejor la CPU (una implementación multiproceso de zip).
Ortwin Angermeier