Suponha que eu tenha um arquivo compactado com gzip tar-ball compressedArchive.tgz (+100 arquivos, totalizando + 5gb).
Qual seria a maneira mais rápida de remover todas as entradas correspondentes a um determinado padrão de nome de arquivo, por exemplo, prefixo * .jpg e, em seguida, armazenar os restos em uma bola de gzip: ed novamente?
Substituir o arquivo antigo ou criar um novo não é importante, o que for mais rápido.
Respostas:
Com o GNU
tar
, você pode fazer:Com
bsdtar
:(
pigz
sendo a versão multithread dogzip
).Você pode sobrescrever o arquivo sobre si mesmo, como:
Mas isso é bastante arriscado, especialmente se o resultado acabar sendo menos compactado que o arquivo original (nesse caso, o segundo
pigz
poderá acabar substituindo as áreas do arquivo que o primeiro ainda não leu).fonte
Não descarte da maneira mais fácil: ela pode ser rápida o suficiente para o seu propósito. Com o avfs para acessar o arquivo morto como um diretório:
Com ferramentas mais primitivas, primeiro extraia os arquivos excluindo os
.jpg
arquivos e crie um novo arquivo morto.Se o seu alcatrão tem
--exclude
:No entanto, isso pode alterar a propriedade e os modos do arquivo, se você não executá-lo como root. Para obter melhores resultados, use um diretório temporário em um sistema de arquivos rápido - tmpfs, se você tiver um que seja grande o suficiente.
O suporte aos arquivadores para atuar como passagem (isto é, ler um arquivo e escrever um arquivo) tende a ser limitado. O tar GNU pode excluir membros de um arquivo com a
--delete
opção de operação (“A--delete
opção foi relatada para funcionar corretamente quandotar
atua como um filtro destdin
parastdout
.”), E essa é provavelmente a sua melhor opção.Você pode criar poderosos filtros de arquivamento em algumas linhas do Python. Sua
tarfile
biblioteca pode ler e gravar a partir de fluxos não procuráveis, e você pode usar código arbitrário no Python para filtrar, renomear, modificar…fonte
tar
, você pode querer adicionar ap
opção.Com o alcatrão que vem no Mac OSX, você pode fazer o seguinte:
fonte
Para fazer isso, você provavelmente precisará extrair todo o conteúdo do arquivo .tgz em um diretório local e, em seguida, apagar os arquivos que não deseja e, em seguida, recomprimir o arquivo .tgz.
É longo e você precisa de espaço livre em disco suficiente, mas, pelo que sei, não há outra maneira de fazê-lo.
Dado que você já possui um caminho como
/tmpdir/withalotofspace
esse e possui espaço livre suficiente (verifique usandodf -h /tmpdir/withalotofspace
), você pode fazer algo assim:fonte
Gosto da resposta do @Gilles, exceto que pode ser ainda mais simplificada. Após descompactar, por exemplo,
gunzip foo.tgz
o arquivo seráfoo.tar
e os arquivos poderão ser removidos comtar -f foo.tar --delete file|directory
. Abaixo está um exemplo de remoção de um diretório de um arquivo tar.Tipos de arquivos específicos podem ser encontrados com
tar -tf foo.tar|egrep -i '.jpg$'
.fonte