आसान तरीके से छूट न दें: यह आपके उद्देश्य के लिए पर्याप्त तेज़ हो सकता है। एक निर्देशिका के रूप में संग्रह को एक्सेस करने के लिए 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
हालाँकि, यदि आप इसे रूट के रूप में नहीं चलाते हैं, तो फ़ाइल स्वामित्व और मोड को मैंग्ल कर सकते हैं। सर्वोत्तम परिणामों के लिए, एक तेज फाइलसिस्टम पर एक अस्थायी निर्देशिका का उपयोग करें - यदि आपके पास एक है जो काफी बड़ा है।
अभिलेखागार के लिए एक पास-थ्रू के रूप में कार्य करने का समर्थन (यानी एक संग्रह पढ़ें और एक संग्रह लिखें) सीमित हो जाता है। GNU टार --delete
ऑपरेशन ऑप्शन के साथ एक आर्काइव से सदस्यों को हटा सकता है (“ --delete
विकल्प को ठीक से काम करने के लिए सूचित किया गया है जब tar
से फिल्टर के रूप में कार्य करता stdin
हैstdout
।"), और कहा कि शायद आपका सबसे अच्छा विकल्प है।
आप पायथन की कुछ पंक्तियों में शक्तिशाली संग्रह फ़िल्टर बना सकते हैं। इसकी tarfile
लाइब्रेरी गैर-शोध योग्य धाराओं से पढ़ और लिख सकती है, और आप पायथन में मनमाने कोड का उपयोग फ़िल्टर करने, नाम बदलने, संशोधित करने…
#!/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()