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.

Doug
fonte
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

amitchhajer
fonte
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
VH
fonte
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 -
Jeremy J Starcher
fonte
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