पूरी तरह से चिथड़े और एक त्वरित, किसी न किसी स्केच के रूप में यह है, लेकिन 3000 फाइलों के साथ एक निर्देशिका पर परीक्षण किया गया है, नीचे दी गई स्क्रिप्ट ने बहुत तेज़ गति से किया:
#!/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
फ़ाइलें उसी निर्देशिका में बनाई जाएंगी जहाँ फ़ाइलें हैं।
व्याख्या
लिपी:
- निर्देशिका में सभी फ़ाइलों को सूचीबद्ध करता है
- टीडी फ़ाइल में पथ की जानकारी जोड़ने से रोकने के लिए निर्देशिका में सीडी
- फ़ाइल सूची के माध्यम से पढ़ता है, उन्हें सेट डिवीजन द्वारा समूहीकृत करता है
- उप समूह (ओं) को गिने फ़ाइलों में संपीड़ित करता है
संपादित करें
स्वचालित रूप से mb में आकार के अनुसार विखंडू बनाएं
अधिक परिष्कृत एक (दूसरे) तर्क के रूप में विखंडू के अधिकतम आकार (एमबी में) का उपयोग करना है। नीचे दी गई लिपि में, चंक जैसे ही दहलीज तक पहुँचता है (गुजरता है) एक संपीड़ित फ़ाइल में लिखा जाता है।
चूंकि स्क्रिप्ट चौकों से अधिक होती है, इसलिए यह सीमा से अधिक है, यह तभी काम करेगा जब (सभी) फ़ाइलों का आकार चंक आकार से काफी छोटा हो।
लिपी:
#!/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
... जहां तारकोल टार कमांड के लिए इनपुट का आकार है ।
इस में, @DavidFoerster द्वारा सुझाए गए सुधार शामिल हैं। बहुत बहुत धन्यवाद !
tar
उन सभी फ़ाइलों को जोड़कर एक निश्चित पैटर्न के साथ शुरू कर सकते हैं जब तक कि आप उन सभी को नहीं करते। यह आसानी से लिपिबद्ध किया जा सकता है, लेकिन इसकी गारंटी नहीं है कि आकार 9 एमबी से कम होगा, जैसा कि आपकी आवश्यकता है। हालाँकि, आप मैन्युअल रूप से उन फ़ाइलों के आकार को समायोजित कर सकते हैं जो उन्हें आगे विभाजित करके बहुत बड़ी हैं।