Non fare sconti in modo semplice: potrebbe essere abbastanza veloce per il tuo scopo. Con avfs per accedere all'archivio come directory:
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
Con strumenti più primitivi, prima estrai i file escludendo i .jpg
file, quindi crea un nuovo archivio.
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 il tuo tar ha --exclude
:
mkdir tmpdir && cd tmpdir
tar -xzf original.tar.gz --exclude='*.jpg'
tar -czf filtered.tar.gz .
cd .. && rm -rf tmpdir
Ciò può tuttavia manipolare la proprietà e le modalità del file se non lo si esegue come root. Per i migliori risultati, usa una directory temporanea su un filesystem veloce - tmpfs se ne hai uno abbastanza grande.
Il supporto degli archivi per agire da pass-through (ovvero leggere un archivio e scrivere un archivio) tende ad essere limitato. Tar GNU può eliminare membri da un archivio con l' --delete
opzione operativa (“È --delete
stato segnalato che l'opzione funziona correttamente quando tar
funge da filtro da stdin
astdout
."), E questa è probabilmente l'opzione migliore.
Puoi creare potenti filtri di archiviazione in poche righe di Python. La sua tarfile
libreria può leggere e scrivere da flussi non ricercabili e puoi usare codice arbitrario in Python per filtrare, rinominare, modificare ...
#!/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()