我在 Ubuntu 16.04 上。
我有一个包含很多文本文件的文件夹(几乎 12k)。我需要将它们全部上传到接受.tar.gz
上传的网站,然后自动解压缩它们,但每个文件的限制为 10MB (10000KB)(因此特别是每个文件都必须自行解压缩)。如果我tar.gz
所有这些文件,生成的文件大约是 72MB。
我想做的是创建八个.tar.gz
文件,每个文件的大小/尺寸(严格)小于 10000KB。
或者,可以假设上述所有文件的尺寸大致相同,因此我想创建八个.tar.gz
文件,每个文件或多或少相同数量的文件。
我怎样才能完成这两个任务中的任何一个?
我对涉及 GUI、CLI 或脚本的解决方案非常满意。我不是在这里寻找速度,我只是需要它完成。
完全拼凑和快速粗略的草图,但在包含 3000 个文件的目录上进行了测试,下面的脚本做得非常快:
如何使用
compress_split.py
使用您的文件作为参数的目录运行它:
编号
.tar.gz
文件将创建在与文件所在的目录相同的目录中。解释
剧本:
编辑
按 mb 大小自动创建块
更复杂的是使用块的最大大小(以 mb 为单位)作为(第二个)参数。在下面的脚本中,一旦块达到(通过)阈值,就会将块写入压缩文件。
由于脚本是由块触发的,超过阈值,这仅在(所有)文件的大小大大小于块大小时才有效。
剧本:
跑步:
...其中 chunksize 是tar 命令的输入大小。
在这一篇中,包含了@DavidFoerster 提出的改进建议。非常感谢!
纯shell方法:
解释
files=(*)
: 将文件列表(如果有的话也包括目录,更改为files=(*.txt)
只获取带有txt
扩展名的东西)在数组中$files
。num=$((${#files[@]}/8));
:${#files[@]}
是数组中的元素数$files
。这$(( ))
是 bash 的(有限)算术运算方式。因此,此命令设置$num
为文件数除以 8。k=1
: 只是一个命名 tarball 的计数器。for ((i=0; i<${#files[@]}; i+=$num)); do
: 遍历数组的值。在(数组的第一个元素)$i
处初始化并递增. 这一直持续到我们遍历所有元素(文件)为止。0
$num
tar cvzf files$i.tgz -- ${files[@]:$i:$num}
:在 bash 中,您可以使用 获取数组切片(数组的一部分)${array[@]:start:length}
,因此${array[@]:2:3}
将从第二个元素开始返回三个元素。在这里,我们正在获取一个从 的当前值开始$i
并且长度为$num
元素的切片。如果--
您的任何文件名可以以-
.((k++))
: 增量$k