Você não precisa compactar o arquivo, basta adicionar os arquivos já compactados a ele.
tar -cf archive.tar directory_with_compressed_files
Eu tenho muito (~ 5 milhões) de arquivos pequenos, cada um compactado individualmente com gzip
. Eu gostaria de transformá-los em um grande tar.gz
archive para economizar espaço (metadados), mas há limitações:
tar.gz
, então tenho que fazer isso no lugar . Relação de redução é muito boa, cerca de 15: 1. O que posso fazer?
Você não precisa compactar o arquivo, basta adicionar os arquivos já compactados a ele.
tar -cf archive.tar directory_with_compressed_files
Se tiver apenas espaço suficiente para fazer um pequeno número de arquivos, você poderá fazer o arquivamento em partes, e pode até mesmo ser automatizado se quiser. Supondo que seus arquivos estão armazenados algo assim:
.
+-dir0000
| +-file0000.gz
| +-file0001.gz
| [...]
+-dir0001
| +-file1000.gz
| +-file1001.gz
[...]
Para cada diretório, execute (da raiz compartilhada dos arquivos):
tar rf /path/to/archive_name.tar dir_name
rm -r dir_name
Se você estiver certo em automatizar isso (tentei e funcionou, mas você recebe mensagens de erro de find
, que podem ser ignoradas), tente o seguinte:
find * -maxdepth 1 -type d -exec sh -c "tar rf /path/to/archive_name '{}' && rm -r '{}'" \;
(Como sempre, tente isso primeiro em uma estrutura de diretórios de teste para poder verificar se está fazendo o que você quer!)
Eu citei o {}
caso seus diretórios tenham espaços. Se você tiver uma estrutura de arquivos simples, poderá fazer algo semelhante, apenas sem -type d
. Certifique-se de não usar +
no final de -exec
, senão find
tentará fazer um monte de arquivos / diretórios ao mesmo tempo, o que acaba com o ponto de quebrar o arquivamento em primeiro lugar !
Eventualmente, todos os arquivos serão movidos para o arquivo. Vai ser lento, mas isso pode ser feito.