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:
cd ~/.avfs/path/to/original.tar.gz\#
pax -w -s '/^.*\.jpg$//' | gzip >/path/to/filtered.tar.gz # POSIX
tar -czf /path/to/filtered.tar.gz -s '/^.*\.jpg$//' . # BSD
tar -czf /path/to/filtered.tar.gz --transform '/^.*\.jpg$//' . # GNU
Com ferramentas mais primitivas, primeiro extraia os arquivos excluindo os .jpg
arquivos e crie um novo arquivo morto.
mkdir tmpdir && cd tmpdir
<original.tar.gz gzip -d | pax -r -pe -s '/^.*\.jpg$//'
pax -w . | gzip >filtered.tar.gz
cd .. && rm -rf tmpdir
Se o seu alcatrão tem --exclude
:
mkdir tmpdir && cd tmpdir
tar -xzf original.tar.gz --exclude='*.jpg'
tar -czf filtered.tar.gz .
cd .. && rm -rf tmpdir
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 quando tar
atua como um filtro de stdin
para stdout
.”), 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…
#!/usr/bin/python
import re, sys, tarfile
source = tarfile.open(fileobj=sys.stdin, mode='r|*')
dest = tarfile.open(fileobj=sys.stdout, mode='w|gz')
for member in source:
if not (member.isreg() and re.match(r'.*\.jpg\Z', member.name)):
sys.stderr.write(member.name + '\n')
dest.addfile(member, source.extractfile(member))
dest.close()