Como compactar todos os arquivos em todos os subdiretórios em um único arquivo compactado no bash


201

Possível duplicata:
compactar um conjunto de diretórios e criar um arquivo compactado tar

Esta publicação descreve como compactar cada arquivo individualmente em uma estrutura de diretórios. No entanto, preciso fazer algo um pouco diferente. Preciso produzir um grande arquivo gzip para todos os arquivos em um determinado diretório. Também preciso especificar o nome do arquivo de saída para o arquivo compactado (por exemplo, files.gz) e substituir o antigo arquivo de arquivo compactado, se já existir.


gzippor sua própria natureza, comprime apenas um único arquivo. Para colocar vários arquivos em um arquivo para gzipping subsequente, use tar.
Thomas

Respostas:


387
tar -zcvf compressFileName.tar.gz folderToCompress

tudo em folderToCompress irá para compressFileName

Edit: Após revisão e comentários, percebi que as pessoas podem se confundir com compressFileName sem uma extensão. Se desejar, você pode usar a extensão .tar.gz (como sugerido) com o compressFileName


2
Obrigado. Isso compactará tudo em "folderToCompress" (ou seja, recursivamente)?
Doug

2
tudo em folderToCompress irá para compressFileName
amitchhajer

80
Você provavelmente vai querer escolher, compressFileNamepor isso inclui a .tar.gzextensão ou enlouquecerá todo mundo.
Drewish

9
Isso também funciona para um número arbitrário de diretórios, por exemplo tar -zcvf two-dirs.tar.gz dir-one dir-two, criará um arquivo contendo dois diretórios.
Zoltán

5
Também trabalha com *para compactar tudo no diretório atual, ou seja:tar -zcvf all.tar.gz *

61

existem muitos métodos de compactação que funcionam recursivamente na linha de comando e é bom saber quem é o público final.

ou seja, se for para ser enviado a alguém executando o Windows, o zip provavelmente será o melhor:

zip -r file.zip folder_to_zip

unzip filenname.zip

para outros usuários linux ou o seu tar é ótimo

tar -cvzf filename.tar.gz folder

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

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

É preciso ter cuidado com o alcatrão e como as coisas são alcatradas / extraídas, por exemplo, se eu executar

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


pwd

/ home / myusername

tar -xvzf passwd.tar.gz

isso criará / home / myusername / etc / passwd

inseguro se todas as versões do tar fazem isso:

 Removing leading `/' from member names

18

A publicação de @amitchhajer funciona para GNU tar. Se alguém encontrar esta postagem e precisar que ela funcione em um GNUsistema NÃO , poderá fazer isso:

tar cvf - folderToCompress | gzip > compressFileName

Para expandir o arquivo morto:

zcat compressFileName | tar xvf -

2
Além de portátil, esta solução é útil se você deseja passar argumentos para o gzip (por exemplo, --test ou --best), pois o afaik, mesmo o tar GNU, não fornece uma maneira de enviar argumentos para o gzip.
Timóteo Woods,

Isso é versátil, pois você também pode usar outros compressores. Por exemplo, pigzque é mais rápido, pois pode utilizar melhor a CPU (uma implementação multi-threaded do zip).
Ortwin Angermeier
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.