Sepenuhnya tambal sulam dan sketsa kasar yang cepat, tetapi diuji pada direktori dengan 3000 file, skrip di bawah ini melakukan pekerjaan yang sangat cepat:
#!/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)
Cara Penggunaan
.tar.gz
file bernomor akan dibuat di direktori yang sama dengan tempat file tersebut.
Penjelasan
Naskah:
- daftar semua file dalam direktori
- cd ke dalam direktori untuk mencegah penambahan info jalur ke file tar
- membaca melalui daftar file, mengelompokkannya berdasarkan divisi yang ditetapkan
- kompres sub grup menjadi file bernomor
EDIT
Secara otomatis membuat potongan berdasarkan ukuran dalam mb
Lebih canggih adalah dengan menggunakan ukuran maksimum (dalam mb) dari potongan sebagai argumen (kedua). Dalam skrip di bawah ini, potongan ditulis ke dalam file terkompresi begitu potongan mencapai (melewati) ambang batas.
Karena skrip dipicu oleh chunk, melebihi ambang, ini hanya akan berfungsi jika ukuran (semua) file secara substansial lebih kecil dari ukuran chunk.
Naskah:
#!/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)
Untuk berlari:
python3 /path/tocompress_split.py /directory/with/files/tocompress chunksize
... di mana chunksize adalah ukuran input untuk perintah tar.
Dalam hal ini, perbaikan yang disarankan oleh @DavidFoerster disertakan. Terima kasih banyak !
tar
melakukannya dengan menambahkan semua file mulai dengan pola tertentu hingga Anda memiliki semuanya. Ini dapat dengan mudah dituliskan tetapi tidak menjamin ukurannya akan lebih rendah dari 9MB yang Anda butuhkan. Anda bisa, bagaimanapun, secara manual menyesuaikan ukuran file-file yang terlalu besar dengan membaginya lebih lanjut.