完全是拼凑而成,并且是一个快速,粗略的草图,但是在包含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
文件将在与文件所在目录相同的目录中创建。
说明
剧本:
- 列出目录中的所有文件
- cd进入目录,以防止将路径信息添加到tar文件中
- 读取文件列表,按设置的分区对它们进行分组
- 将子组压缩为编号文件
编辑
根据mb大小自动创建块
更复杂的是将块的最大大小(以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
...其中chunksize是tar命令的输入大小。
在这一本书中,包含了@DavidFoerster提出的建议改进。感谢了很多!
tar
通过添加以特定模式开头的所有文件,直到拥有全部文件来实现它们。这可以很容易地编写脚本,但是不能保证大小会根据需要小于9MB。但是,您可以通过进一步拆分来手动调整太大的文件的大小。