อย่าลดวิธีง่ายๆ: อาจเร็วพอสำหรับวัตถุประสงค์ของคุณ กับ 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
อย่างไรก็ตามนี่อาจทำให้ไฟล์เป็นเจ้าของและโหมดหากคุณไม่เรียกใช้ในฐานะรูท เพื่อผลลัพธ์ที่ดีที่สุดให้ใช้ไดเร็กทอรีชั่วคราวบนระบบไฟล์อย่างรวดเร็ว - tmpfs หากคุณมีขนาดใหญ่พอ
การสนับสนุนสำหรับผู้จัดเก็บเพื่อทำหน้าที่ส่งผ่าน (เช่นอ่านไฟล์เก็บถาวรและเขียนไฟล์เก็บถาวร) มีแนวโน้มที่จะถูก จำกัด tar ของ GNU สามารถลบสมาชิกออกจากไฟล์เก็บถาวรด้วย--delete
ตัวเลือกการดำเนินการ (“ --delete
ตัวเลือกนั้นได้รับรายงานว่าทำงานอย่างถูกต้องเมื่อtar
ทำหน้าที่เป็นตัวกรองจากstdin
ถึงstdout
”) และนั่นอาจเป็นตัวเลือกที่ดีที่สุดของคุณ
คุณสามารถสร้างตัวกรองการเก็บถาวรที่มีประสิทธิภาพในไม่กี่บรรทัดของ Python ใช้tarfile
ห้องสมุดสามารถอ่านและเขียนจากลำธารที่ไม่ใช่ seekable และคุณสามารถใช้โค้ดในหลามตัวกรอง, เปลี่ยนชื่อ, แก้ไข ...
#!/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()