inverte tar de '--to-command', ou: compactando entradas de tar individualmente, ou: tar com muitos arquivos grandes

1

Eu gostaria de criar o arquivo tar gzip, mas faça da maneira inversa do que é mais comumente feito - ter os arquivos no arquivo compactados individualmente, em vez de compactar todo o arquivo: dessa forma, ele retém a propriedade que procura. deveria. Faz muito mais sentido para mim, e eu não sei porque isso não foi favorecido.

Tenho algumas ideias sobre como fazer isso:

  • use uma ferramenta de arquivamento com compactação, como 7zip
  • escreva meu próprio script para fazer isso compactando primeiro os arquivos e, em seguida, alimentando-os para tar ( já encontrou um prático script Python para escrever um arquivo tar e a biblioteca gzip do Python parece fácil de usar .

No entanto, idealmente, eu gostaria de continuar a usar o tar para isso, pois é uma ferramenta familiar e de fato para arquivar onde eu trabalho. O tar tem a opção --to-command , que permite canalizar os arquivos extraídos para um programa. Se eu tivesse um comando simétrico como --from-command , eu implementaria facilmente meu desejo com:

tar cf my_archive.tar file1 file2 --from-command=gzip
tar xf my_archive.tar --to-command=gunzip

Minha motivação vem de lidar com arquivos contendo um grande número de arquivos grandes. No momento, eu monto-os, mas depois extraí-los do arquivo leva muito tempo - ele precisa ser descompactado antes que o tar possa acessar o arquivo, e o faz de maneira serial!

Então, aqui estão minhas perguntas:

  • Existe uma maneira evidente de conseguir isso que estou desconsiderando?
  • Alguém já escreveu uma ferramenta para fazer, especificamente com tar ?
  • Se alguém chamasse tar e gzip e métodos padrão de arquivamento e compactação no Linux, qual seria o método popular equivalente para arquivar com compactação da maneira que mencionei sobre (ou seja, não tar.gz )
  • Existe outra maneira em que estou esquecendo a grande quantidade de tempo que leva para extrair um arquivo de um grande arquivo compactado no tar?

Obrigado!

EDITAR

Eu percebo que preciso reescrever e refinar minha pergunta. Especialmente desde que, como Robin Hood apontou, existem soluções bastante fáceis para criar arquivos compactados (a saber, zip ). Então aqui está:

Existe uma maneira de usar tar que permite acesso aleatório verdadeiro ao arquivo enquanto ainda o mantém compactado? Se não, existe outro tar -replacement para Linux (que é construído com a mesma lógica e, idealmente, com suporte para as mesmas opções de linha de comando), que faz isso?

Neste momento, posso substituir tar em um sentido geral por zip , alterando:

tar c path/to/file1 path/to/file2 | gzip > arc.tar.gz
gunzip < arc.tar.gz | tar x

para:

zip -qr - path/to/file1 path/to/file2 > arc.zip
unzip -qoX test.zip

No entanto, isso tem a desvantagem de não suportar todas as opções que tar faz para arquivamento, a saber:

  1. canalizando cada arquivo extraído individualmente para um canal (a opção --to-command )
  2. unzip não aceita um arquivo na entrada padrão. funzip , no entanto - só gera o arquivo primeiro no arquivo

Então, é bastante limitante.

Obrigado novamente!

    
por Yuval 31.10.2014 / 01:39

2 respostas

1

Li sua pergunta várias vezes, é muito difícil de entender, mas acho que entendi agora. Você deseja que os arquivos sejam colocados em arquivos tar individuais e, em seguida, todos armazenados em um arquivo gz. Isso não vai funciona porque arquivos gz suportam apenas compactação de 1 arquivo e é por isso que as pessoas colocam os arquivos antes de comprimir com gz. Você pode fazer o oposto, colocar cada arquivo em um arquivo gz e colocar todos os arquivos  arquivos gz em um único arquivo tar. Como alternativa, você pode simplesmente parar de usar formatos que exijam o dobro arquivamento e use um formato de arquivo que suporte vários arquivos, como zip.

A compactação dos arquivos dentro de um tar ainda resultará em acesso sequencial dos arquivos gz, porque o tar formato não suporta acesso aleatório. Arquivos compactados usam um catelogo centralizado para que o acesso aleatório a arquivos seja possível sem descompactar ou ler todo o arquivo. Eu não faço muito arquivamento no Linux, mas no Windows eu gosto de usar o 7-zip para criar arquivos zip com compressão lzma. É importante notar que qualquer um desses métodos, quando usado com compactação comparável ao seu tar.gz, irá gerar um arquivo maior devido à falta de compactação sólida, razão pela qual o tar.gz é muito popular no mundo linux comparado ao zip para distribuir software .

Crie uma série de arquivos GZ e armazene em um arquivo de alcatrão:

cp -a -n -v "/home/me/example/inputfiles/." --target-directory="/home/me/example/gzfiles"

Isto irá copiar os arquivos que você deseja arquivar para uma pasta diferente. Gunzip não permite manter o arquivos desarquivados originais, mas trabalhar a partir de uma cópia permitirá que você evite isso.

gzip -9 "/home/me/example/gzfiles/*"

Isso criará um arquivo gz separado de cada arquivo e usará a compactação máxima. Se o seu sistema não consegue lidar com isso tente um número menor; o número padrão é 6.

tar -cf "/home/me/example/tar/archive.tar" -C "/home/me/example/gzfiles ."

Isto irá criar um único arquivo tar que contém todos os arquivos gz.

Extrair um único arquivo de um arquivo GZ em um arquivo de alcatrão:

sudo apt-get install archivemount

Isso instalará o arquivo morto, uma ferramenta que pode montar arquivos tar em um diretório.

archivemount -o readonly "/home/me/example/tar/archive.tar" "/home/me/example/mount"

Isto irá montar o arquivo tar para que você possa extrair o arquivo gz desejado. Eu acredito que é possível extrair arquivos individuais de um arquivo tar com tar, mas eu não sei o comando, por isso estou usando essa abordagem.

gunzip -c "/home/me/example/mount/example1.txt.gz" > "/home/me/example/extract1/example1.txt"

Isso extrairá o arquivo. O Gunzip suporta apenas a extração para o diretório de origem ou para a saída padrão neste comando, usamos a saída padrão e, em seguida, canalizamos a saída para um arquivo.

sudo umount "/home/me/example/mount"

Isso desmontará o arquivo tar.

Extraia todos os arquivos de uma série de arquivos GZ em um arquivo de alcatrão:

cd "/home/me/example/extractall"

Isso coloca o terminal no diretório que você deseja extrair, pois o tar extrai para o diretório atual.

tar -xf /home/me/example/tar/archive.tar

Isso extrai os arquivos gz.

gunzip *.gz

Isso extrai o conteúdo dos arquivos gz para o diretório atual /home/me/example/extractall/ e remove os arquivos gz.

Crie um arquivo ZIP:

cd "/home/me/example/inputfiles"

Isso coloca o terminal no diretório inputfiles, já que o zip cria um arquivo do diretório atual e salva nele.

zip -9 -r inputfiles inputfiles.zip *

Isso criará um arquivo zip de todo o conteúdo do diretório inputfiles, excluindo arquivos ocultos e usando a compactação máxima. O p7-zip seria uma ferramenta melhor para usar se você precisar de alta compactação.

mv "/home/me/example/inputfiles/inputfiles.zip" "/home/me/example/zip/archive.zip"

Isso permitirá que você renomeie o arquivo como quiser e mova-o para onde desejar.

Extrair um arquivo ZIP:

cd "/home/me/example/zip"

Isso coloca o terminal no diretório que contém o zip.

unzip -n archive.zip

Isso extrai o conteúdo dos arquivos zip para o diretório atual.

    
por 31.10.2014 / 07:31
1

Se o que você quer é compactar arquivos individualmente em um arquivo com acesso aleatório, então dar ("Disk ARchive") pode seja o que você está procurando. Versões mais recentes suportam compressão LZMA, o algoritmo usado pelo 7-Zip. Também é possível definir filtros para armazenar alguns tipos de arquivos descompactados e economizar tempo, por ex. arquivos de mídia e arquivos que já possuem sua própria compactação. Meu recurso favorito é compactar arquivos existentes (não compactados) para que eu possa fazer um backup rapidamente agora e executar a compactação LZMA intensiva da CPU em um momento mais conveniente ou em uma máquina mais potente:

dar --empty-dir \
  --fs-root /home \
  --create home-backup-2016-01-11 \
  --prune lost+found

Mais tarde e / ou em outro lugar:

dar -+ home-backup-2016-01-11-compressed-encrypted \
  -A home-backup-2016-01-11 \
  -zxz:6 \
  -K "aes:" \
  -an -ag -Z "*.mpg" -Z "*.avi" -Z "*.flac" -Z "*.cr2" \
  -Z "*.vob" -Z "*.jpg" -Z "*.jpeg" -Z "*.mpeg" -Z "*.png" \
  -Z "*.mp3" -Z "*.ogg" -Z "*.deb" -Z "*.tgz" -Z "*.tbz2" \
  -Z "*.rpm" -Z "*.xpi" -Z "*.run" -Z "*.sis" -Z "*.gz" \
  -Z "*.Z" -Z "*.bz2" -Z "*.zip" -Z "*.jar" -Z "*.rar" \
  -Z "*.xz" -Z "*.dar" -Z "*.7z" -acase

Como mostrado acima, a criptografia também é possível, enquanto ainda permite a extração de arquivos individuais. No entanto, dar não parece ter um equivalente ao --to-command . É difícil dizer a partir de sua pergunta se você pretendia usar esse recurso para qualquer coisa, exceto descompressão.

(Sim, eu sei que essa pergunta é antiga. Isso é para as pessoas que, como eu, pesquisaram "tar compress individualmente" e conseguiram isso como o primeiro resultado.)

    
por 11.01.2016 / 22:45