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 --delete
operasyon seçeneği ( “ --delete
zaman seçenek düzgün çalışması bildirilmiştir tar
gelen bir filtre görevi görür stdin
etmek stdout
.”), Ve muhtemelen en iyi seçenek bu.
Birkaç Python satırında güçlü arşiv filtreleri oluşturabilirsiniz. Onun tarfile
kü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()