Не знижуйте простий спосіб: це може бути досить швидким для ваших цілей. З avfs для доступу до архіву як до каталогу:
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
За допомогою більш примітивних інструментів спочатку витягніть файли, виключаючи .jpg
файли, а потім створіть новий архів.
mkdir tmpdir && cd tmpdir
<original.tar.gz gzip -d | pax -r -pe -s '/^.*\.jpg$//'
pax -w . | gzip >filtered.tar.gz
cd .. && rm -rf tmpdir
Якщо ваш дьоготь --exclude
:
mkdir tmpdir && cd tmpdir
tar -xzf original.tar.gz --exclude='*.jpg'
tar -czf filtered.tar.gz .
cd .. && rm -rf tmpdir
Однак це може призвести до маніпулювання файлами та режимів, якщо ви не запустите його як root. Для найкращих результатів використовуйте тимчасовий каталог у швидкій файловій системі - tmpfs, якщо у вас є достатньо великий.
Підтримка архіваторів, які виконують функцію проходу (тобто читати архів і писати архів), як правило, обмежена. GNU tar може видалити членів з архіву за допомогою --delete
параметра операції ("Повідомлялося, що цей --delete
параметр працює належним чином, коли він tar
виконує функцію фільтра від stdin
до stdout
".), І це, мабуть, найкращий варіант.
Ви можете зробити потужні архівні фільтри в декількох рядках Python. Його tarfile
бібліотека може читати і записувати з нединамічних потоків, а ви можете використовувати довільний код на Python для фільтрації, перейменування, зміни…
#!/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()