Tamamen patchwork ve olduğu gibi hızlı, kaba bir taslak, ancak 3000 dosya içeren bir dizinde test edildi, aşağıdaki komut dosyası son derece hızlı bir iş yaptı:
#!/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)
Nasıl kullanılır
numaralı .tar.gz
dosyalar dosyaların bulunduğu dizinde oluşturulur.
açıklama
Senaryo:
- dizindeki tüm dosyaları listeler
- tar dosyasına yol bilgisi eklenmesini önlemek için cd'ler dizine eklenir
- dosya listesini okur, bunları küme bölümüne göre gruplandırır
- alt grubu / grupları numaralı dosyalara sıkıştırır
DÜZENLE
MB cinsinden boyuta göre otomatik olarak parçalar oluşturun
Daha karmaşık olan ise, parçaların maksimum boyutunu (mb cinsinden) (ikinci) bir argüman olarak kullanmaktır. Aşağıdaki kodda, parçalar eşik değere ulaşır ulaşmaz sıkıştırılmış bir dosyaya yazılır.
Komut dosyası, eşiği aşan parçalar tarafından tetiklendiğinden, bu yalnızca (tüm) dosyaların boyutu yığın boyutundan önemli ölçüde küçükse çalışır.
Senaryo:
#!/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)
Koşmak:
python3 /path/tocompress_split.py /directory/with/files/tocompress chunksize
... chunksize, tar komutu için girdi boyutudur .
Buna, @DavidFoerster tarafından önerilen iyileştirmeler dahildir. Teşekkürler çok !
tar
Belli bir desenle başlayan tüm dosyaları, hepsine sahip olana kadar ekleyerek muhtemelen bunları yapabilirsiniz . Bu kolayca yazılabilir, ancak boyutun ihtiyacınız olan 9 MB'den daha düşük olacağını garanti etmez. Bununla birlikte, çok büyük olan dosyaların boyutunu daha da bölerek manuel olarak ayarlayabilirsiniz.