Całkowicie patchwork i szybki, szorstki szkic, ale testowany w katalogu z 3000 plików, poniższy skrypt wykonał niezwykle szybką pracę:
#!/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)
Jak używać
.tar.gz
pliki ponumerowane zostaną utworzone w tym samym katalogu, w którym znajdują się pliki.
Wyjaśnienie
Scenariusz:
- wyświetla wszystkie pliki w katalogu
- cd do katalogu, aby zapobiec dodaniu informacji o ścieżce do pliku tar
- czyta listę plików, grupując je według podziału zestawu
- kompresuje podgrupy w pliki ponumerowane
EDYTOWAĆ
Automatycznie twórz porcje według rozmiaru w MB
Bardziej wyrafinowane jest użycie maksymalnego rozmiaru (w mb) porcji jako (drugiego) argumentu. W skrypcie poniżej fragmenty są zapisywane w skompresowanym pliku, gdy tylko fragment osiągnie (przekroczy) próg.
Ponieważ skrypt jest uruchamiany przez porcje, przekraczając próg, zadziała to tylko wtedy, gdy rozmiar (wszystkich) plików jest znacznie mniejszy niż porcja.
Scenariusz:
#!/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)
Biegać:
python3 /path/tocompress_split.py /directory/with/files/tocompress chunksize
... gdzie chunksize to rozmiar danych wejściowych dla polecenia tar.
W tym zawarte są sugerowane ulepszenia @DavidFoerster. Dzięki dużo !
tar
je dodać, dodając wszystkie pliki, zaczynając od określonego wzorca, aż uzyskasz je wszystkie. Można to łatwo skrypty, ale nie gwarantuje, że rozmiar będzie mniejszy niż 9 MB, jak potrzebujesz. Można jednak ręcznie dostosować rozmiar tych plików, które są zbyt duże, dzieląc je dalej.