Đừng giảm giá theo cách dễ dàng: nó có thể đủ nhanh cho mục đích của bạn. Với avfs để truy cập kho lưu trữ dưới dạng thư mục:
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
Với các công cụ nguyên thủy hơn, trước tiên hãy trích xuất các tệp trừ các .jpg
tệp, sau đó tạo tệp lưu trữ mới.
mkdir tmpdir && cd tmpdir
<original.tar.gz gzip -d | pax -r -pe -s '/^.*\.jpg$//'
pax -w . | gzip >filtered.tar.gz
cd .. && rm -rf tmpdir
Nếu tar của bạn có --exclude
:
mkdir tmpdir && cd tmpdir
tar -xzf original.tar.gz --exclude='*.jpg'
tar -czf filtered.tar.gz .
cd .. && rm -rf tmpdir
Tuy nhiên, điều này có thể mang quyền sở hữu tập tin và chế độ nếu bạn không chạy nó dưới quyền root. Để có kết quả tốt nhất, hãy sử dụng thư mục tạm thời trên hệ thống tệp nhanh - tmpfs nếu bạn có một thư mục đủ lớn.
Hỗ trợ cho các nhà lưu trữ hoạt động như một truyền qua (tức là đọc một kho lưu trữ và viết một kho lưu trữ) có xu hướng bị hạn chế. GNU tar có thể xóa các thành viên khỏi kho lưu trữ với --delete
tùy chọn hoạt động ( --delete
Tùy chọn đã được báo cáo là hoạt động chính xác khi tar
hoạt động như một bộ lọc từ stdin
đến stdout
.,) Và đó có lẽ là tùy chọn tốt nhất của bạn.
Bạn có thể tạo các bộ lọc lưu trữ mạnh mẽ trong một vài dòng Python. tarfile
Thư viện của nó có thể đọc và viết từ các luồng không thể tìm kiếm và bạn có thể sử dụng mã tùy ý trong Python để lọc, đổi tên, sửa đổi
#!/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()