Nie dyskontuj w prosty sposób: może być wystarczająco szybki dla twojego celu. Z avfs, aby uzyskać dostęp do archiwum jako katalogu:
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
Korzystając z bardziej prymitywnych narzędzi, najpierw wyodrębnij pliki z wyłączeniem .jpg
plików, a następnie utwórz nowe archiwum.
mkdir tmpdir && cd tmpdir
<original.tar.gz gzip -d | pax -r -pe -s '/^.*\.jpg$//'
pax -w . | gzip >filtered.tar.gz
cd .. && rm -rf tmpdir
Jeśli twoja smoła ma --exclude
:
mkdir tmpdir && cd tmpdir
tar -xzf original.tar.gz --exclude='*.jpg'
tar -czf filtered.tar.gz .
cd .. && rm -rf tmpdir
Może to jednak zaburzać własność i tryby plików, jeśli nie uruchomisz go jako root. Aby uzyskać najlepsze wyniki, użyj katalogu tymczasowego w szybkim systemie plików - tmpfs, jeśli masz wystarczająco duży.
Wsparcie dla archiwizatorów działających jako tranzyt (tj. Czytaj archiwum i zapisuj archiwum) jest zwykle ograniczone. GNU tar może usuwać członków z archiwum za pomocą --delete
opcji operacji („Zgłoszono, że --delete
opcja działa poprawnie, gdy tar
działa jak filtr od stdin
do stdout
.”), I to prawdopodobnie najlepsza opcja.
Możesz stworzyć potężne filtry archiwalne w kilku wierszach Pythona. Jego tarfile
biblioteka może odczytywać i zapisywać z niewidocznych strumieni, a także można używać dowolnego kodu w Pythonie do filtrowania, zmieniania nazw, modyfikowania…
#!/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()