Не пренебрегайте простым способом: он может быть достаточно быстрым для вашей цели. С помощью 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()