การเย็บปะติดปะต่อกันอย่างสมบูรณ์และภาพร่างคร่าวๆที่รวดเร็วอย่างที่มันเป็น แต่การทดสอบในไดเรกทอรีที่มีไฟล์ 3,000 ไฟล์สคริปต์ด้านล่างทำงานได้อย่างรวดเร็วมาก:
#!/usr/bin/env python3
import subprocess
import os
import sys
splitinto = 2
dr = sys.argv[1]
os.chdir(dr)
files = os.listdir(dr)
n_files = len(files)
size = n_files // splitinto
def compress(tar, files):
command = ["tar", "-zcvf", "tarfile" + str(tar) + ".tar.gz", "-T", "-", "--null"]
proc = subprocess.Popen(command, stdin=subprocess.PIPE)
with proc:
proc.stdin.write(b'\0'.join(map(str.encode, files)))
proc.stdin.write(b'\0')
if proc.returncode:
sys.exit(proc.returncode)
sub = []; tar = 1
for f in files:
sub.append(f)
if len(sub) == size:
compress(tar, sub)
sub = []; tar += 1
if sub:
# taking care of left
compress(tar, sub)
วิธีใช้
.tar.gz
ไฟล์ที่มีหมายเลขจะถูกสร้างในไดเรกทอรีเดียวกันกับที่เป็นไฟล์
คำอธิบาย
สคริปต์:
- แสดงรายการไฟล์ทั้งหมดในไดเรกทอรี
- cd's ในไดเร็กทอรีเพื่อป้องกันการเพิ่มข้อมูลพา ธ ไปยังไฟล์ tar
- อ่านผ่านรายการไฟล์โดยจัดกลุ่มตามหมวดที่กำหนดไว้
- บีบอัดกลุ่มย่อยลงในไฟล์ที่มีหมายเลข
แก้ไข
สร้างชิ้นโดยอัตโนมัติตามขนาดเป็น mb
ความซับซ้อนมากขึ้นคือการใช้ขนาดสูงสุด (เป็นเมกะไบต์) ของชิ้นข้อมูลเป็นอาร์กิวเมนต์ (วินาที) ในสคริปต์ด้านล่าง chunks จะถูกเขียนลงในไฟล์บีบอัดทันทีที่ chunk ถึง (ผ่าน) threshold
เนื่องจากสคริปต์ถูกทริกเกอร์โดย chunks เกินขีด จำกัด การทำเช่นนี้จะใช้ได้ก็ต่อเมื่อขนาดของไฟล์ (ทั้งหมด) มีขนาดเล็กกว่าขนาดก้อนอย่างมาก
สคริปต์:
#!/usr/bin/env python3
import subprocess
import os
import sys
dr = sys.argv[1]
chunksize = float(sys.argv[2])
os.chdir(dr)
files = os.listdir(dr)
n_files = len(files)
def compress(tar, files):
command = ["tar", "-zcvf", "tarfile" + str(tar) + ".tar.gz", "-T", "-", "--null"]
proc = subprocess.Popen(command, stdin=subprocess.PIPE)
with proc:
proc.stdin.write(b'\0'.join(map(str.encode, files)))
proc.stdin.write(b'\0')
if proc.returncode:
sys.exit(proc.returncode)
sub = []; tar = 1; subsize = 0
for f in files:
sub.append(f)
subsize = subsize + (os.path.getsize(f)/1000000)
if subsize >= chunksize:
compress(tar, sub)
sub = []; tar += 1; subsize = 0
if sub:
# taking care of left
compress(tar, sub)
วิ่ง:
python3 /path/tocompress_split.py /directory/with/files/tocompress chunksize
... โดยที่ chunksize คือขนาดของอินพุตสำหรับคำสั่ง tar
ในส่วนนี้การปรับปรุงที่แนะนำโดย @DavidFoerster จะรวมอยู่ด้วย ขอบคุณมาก !
tar
โดยการเพิ่มไฟล์ทั้งหมดที่เริ่มต้นด้วยรูปแบบที่แน่นอนจนกว่าคุณจะมีพวกเขาทั้งหมด สามารถเขียนสคริปต์ได้อย่างง่ายดาย แต่ไม่รับประกันว่าขนาดจะต่ำกว่า 9MB ตามที่คุณต้องการ อย่างไรก็ตามคุณสามารถปรับขนาดของไฟล์เหล่านั้นด้วยตนเองที่มีขนาดใหญ่เกินไปด้วยตนเองโดยแยกไฟล์เพิ่มเติม