Hoàn toàn chắp vá và một bản phác thảo nhanh, thô, nhưng đã được thử nghiệm trên một thư mục với 3000 tệp, tập lệnh dưới đây đã thực hiện một công việc cực kỳ nhanh chóng:
#!/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)
Cách sử dụng
.tar.gz
các tệp được đánh số sẽ được tạo trong cùng thư mục với vị trí của các tệp.
Giải trình
Kịch bản:
- liệt kê tất cả các tập tin trong thư mục
- cd vào thư mục để ngăn thêm thông tin đường dẫn vào tệp tar
- đọc qua danh sách tập tin, nhóm chúng theo bộ chia
- nén (các) nhóm phụ vào các tệp được đánh số
BIÊN TẬP
Tự động tạo khối theo kích thước tính bằng mb
Tinh vi hơn là sử dụng kích thước tối đa (tính bằng mb) của các khối làm đối số (giây). Trong đoạn script bên dưới, các đoạn được ghi vào một tệp nén ngay khi khối này đạt đến (vượt qua) ngưỡng.
Do tập lệnh được kích hoạt bởi các đoạn, vượt quá ngưỡng, nên tập lệnh này sẽ chỉ hoạt động nếu kích thước của (tất cả) tệp nhỏ hơn đáng kể so với kích thước khối.
Kịch bản:
#!/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)
Chạy:
python3 /path/tocompress_split.py /directory/with/files/tocompress chunksize
... Trong đó chunksize là kích thước của đầu vào cho lệnh tar.
Trong phần này, các cải tiến được đề xuất bởi @DavidFoerster được bao gồm. Cảm ơn rất nhiều !
tar
chúng bằng cách thêm tất cả các tệp bắt đầu bằng một mẫu nhất định cho đến khi bạn có tất cả. Điều này có thể dễ dàng được viết kịch bản nhưng không đảm bảo kích thước sẽ thấp hơn 9MB khi bạn cần. Tuy nhiên, bạn có thể điều chỉnh thủ công kích thước của các tệp quá lớn bằng cách chia nhỏ hơn nữa.