Kolay yolu indirmeyin: Amacınız için yeterince hızlı olabilir. İle AVF'lerin bir dizin olarak arşiv erişmek için:
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
Daha ilkel araçlarla, önce dosyalar hariç dosyaları çıkarın .jpg, ardından yeni bir arşiv oluşturun.
mkdir tmpdir && cd tmpdir
<original.tar.gz gzip -d | pax -r -pe -s '/^.*\.jpg$//'
pax -w . | gzip >filtered.tar.gz
cd .. && rm -rf tmpdir
Katranınız varsa --exclude:
mkdir tmpdir && cd tmpdir
tar -xzf original.tar.gz --exclude='*.jpg'
tar -czf filtered.tar.gz .
cd .. && rm -rf tmpdir
Ancak bu, root olarak çalıştırmazsanız dosya sahipliğini ve modlarını değiştirebilir. En iyi sonuçlar için, hızlı bir dosya sisteminde geçici bir dizin kullanın - yeterince büyük bir dizine sahipseniz tmpfs.
Arşivleyicilerin doğrudan geçiş görevi (yani bir arşivi okuma ve bir arşiv yazma) desteği sınırlı olma eğilimindedir. GNU tar arşiv üyeleri silebilirsiniz ile --deleteoperasyon seçeneği ( “ --deletezaman seçenek düzgün çalışması bildirilmiştir targelen bir filtre görevi görür stdinetmek stdout.”), Ve muhtemelen en iyi seçenek bu.
Birkaç Python satırında güçlü arşiv filtreleri oluşturabilirsiniz. Onun tarfilekütüphane okuyup olmayan seekable derelerden yazma, ve değiştirmek, filtre, yeniden adlandırma Python rasgele kod kullanabilirsiniz edebilirsiniz ...
#!/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()