Jangan mengabaikan cara yang mudah: itu mungkin cukup cepat untuk tujuan Anda. Dengan avfs untuk mengakses arsip sebagai direktori:
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
Dengan alat yang lebih primitif, ekstrak terlebih dahulu file tidak termasuk .jpg
file, lalu buat arsip baru.
mkdir tmpdir && cd tmpdir
<original.tar.gz gzip -d | pax -r -pe -s '/^.*\.jpg$//'
pax -w . | gzip >filtered.tar.gz
cd .. && rm -rf tmpdir
Jika tar Anda memiliki --exclude
:
mkdir tmpdir && cd tmpdir
tar -xzf original.tar.gz --exclude='*.jpg'
tar -czf filtered.tar.gz .
cd .. && rm -rf tmpdir
Namun ini dapat memotong kepemilikan file dan mode jika Anda tidak menjalankannya sebagai root. Untuk hasil terbaik, gunakan direktori sementara pada sistem file cepat - tmpfs jika Anda memiliki yang cukup besar.
Dukungan bagi pengarsip untuk bertindak sebagai pass-through (yaitu membaca arsip dan menulis arsip) cenderung terbatas. Tar GNU dapat menghapus anggota dari arsip dengan --delete
opsi operasi (" --delete
Opsi tersebut telah dilaporkan berfungsi dengan baik ketika tar
bertindak sebagai filter dari stdin
ke stdout
."), Dan itu mungkin opsi terbaik Anda.
Anda dapat membuat filter arsip yang kuat dalam beberapa baris Python. Its tarfile
perpustakaan dapat membaca dan menulis dari non-seekable sungai, dan Anda dapat menggunakan kode sewenang-wenang dengan Python untuk filter, rename, memodifikasi ...
#!/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()