Eu tenho um arquivo .7z contendo ~ 360.000 imagens em vários diretórios. Gostaria de convertê-lo em um .tar para que eu possa abri-lo em outro computador. Existe uma maneira melhor do que extraí-lo em arquivos e compactá-los novamente? É possível fazer a conversão diretamente?
10
.7z
arquivo em outro computador?Respostas:
Não é muito difícil escrever algo para fazer o trabalho. Aqui está um exemplo de script Perl (requer o módulo Archive :: Libarchive :: XS ).
Se você queria um tar.gz / tar.bz2 / tar.xz arquivo, adicione a linha
archive_write_add_filter_gzip($out);
ouarchive_write_add_filter_bzip2($out);
ouarchive_tar_add_filter_xz($out);
depois daarchive_write_set_format
linha.Isso não usa espaço em disco temporário (apenas o espaço para o arquivo tar de saída) e muito pouca RAM (apenas alguns MB para perl, mas funciona com os arquivos um bloco por vez, portanto, não há problema se os arquivos forem maiores que a sua RAM).
fonte
.7z
arquivos são arquivos frequentemente compactados com algum tipo de algoritmo, enquanto.tar
arquivos são apenas arquivos.Eles diferem em seu escopo e, na maioria dos casos, uma conversão exigiria uma descompactação opcional sempre seguida de uma extração do arquivo de origem. Mesmo se um
.7z
arquivo não usasse nenhuma compactação, ainda assim exigiria uma extração.Dito isto, se você pretendia [descompactar] / extrair / pesquisar o arquivo de origem de uma só vez, a resposta é que você não pode, pelo menos não usar as ferramentas padrão do Ubuntu porque
tar
não pode lerstdin
, então você não pode canalizar7z
etar
. De qualquer forma, é muito fácil automatizar tudo em um único comando:* <path_to_archive> = caminho para o
.7z
arquivo de origemAlém disso, o tempo necessário para que os arquivos do arquivo de origem sejam gravados no disco e para que os arquivos extraídos sejam lidos para descompactar / extrair / pesquisar o arquivo de origem em duas etapas é um gargalo para a tarefa inteira, principalmente (embora não somente) devido à baixa velocidade de E / S de um disco em potencial, portanto, uma solução parcial seria armazenar os arquivos temporários em um ramdisk para quase anular o gargalo geral:
sudo mkdir /mnt/tmpfs
sudo mount -t tmpfs -o size=<tmpfs_size> tmpfs /mnt/ramdisk
* <tmpfs_size> = tamanho do sistema de arquivos em bytes * 10 3 (1, 1K, 1M, 1G, ...)mkdir /mnt/tmpfs/tmp && 7z x <path_to_source_archive> -o/mnt/tmpfs/tmp && tar cf archive.tar /mnt/tmpfs/tmp && rm -rf /mnt/tmpfs/tmp
* <path_to_archive> = caminho para o.7z
arquivo de origemsudo umount
sudo rmdir /mnt/tmpfs
fonte