![文件数量有限的 Zip 存档](https://linux22.com/image/59145/%E6%96%87%E4%BB%B6%E6%95%B0%E9%87%8F%E6%9C%89%E9%99%90%E7%9A%84%20Zip%20%E5%AD%98%E6%A1%A3.png)
我可以使用什么命令来创建zip
有文件数量限制的文件?我有一个包含 5000 个文件的文件夹(没有子文件夹),因此我需要一个命令来分割该数字并创建 10 个单独的zip
档案,每个档案包含不超过 500 个文件。
我也不希望生成的 10 个zip
文件相互连接,这样我就可以单独打开它们,而不需要同时打开所有 10 个文件。
答案1
您可以使用GNU并行这样做,因为它可以限制作业的元素数量并提供作业编号(对于唯一的 zip 存档名称):
$ touch $(seq 20)
$ find . ! -name "*.zip" -type f -print0 | parallel -0 -N 5 zip arch{#} {}
adding: 1 (stored 0%)
adding: 10 (stored 0%)
adding: 11 (stored 0%)
adding: 12 (stored 0%)
adding: 13 (stored 0%)
adding: 14 (stored 0%)
adding: 15 (stored 0%)
adding: 16 (stored 0%)
adding: 17 (stored 0%)
adding: 18 (stored 0%)
adding: 19 (stored 0%)
adding: 2 (stored 0%)
adding: 20 (stored 0%)
adding: 3 (stored 0%)
adding: 4 (stored 0%)
adding: 5 (stored 0%)
adding: 6 (stored 0%)
adding: 7 (stored 0%)
adding: 8 (stored 0%)
adding: 9 (stored 0%)
$ ls
1 11 13 15 17 19 20 4 6 8 arch1.zip arch3.zip
10 12 14 16 18 2 3 5 7 9 arch2.zip arch4.zip
该选项-N 5
将每个存档的文件数量限制为 5 个,并zip
代替{}
(逐字{#}
记录,在调用过程中不要由您替换)被职位编号替换,导致等arch1.zip
。arch2.zip
选项-print0
和选项同时使用可确保正确处理带有特殊字符的文件名find
。-0
parallel
答案2
接受的答案对我来说效果很好。 :) 但是,如果您无法访问并行(谁知道为什么),这是我之前提出的替代方案:
find . ! -name '*.zip' -type f | xargs -n 500 | awk '{system("zip myarch"NR".zip "$0)}'
这将创建 myarch1.zip、myarch2.zip、myarch3.zip 等,如果您有奇怪的文件名,您可能需要使用 Anthon 建议的 -0 技巧。
答案3
仅 shell 的替代方案:处理批次数数文件通过"${@:START:COUNT}"
(位置参数范围)并shift COUNT
同时递增计数器c
来命名档案:
放 - * c=1 而(($#));做 如果 [ $# -ge数数];然后 zip ${c}.zip "${@:1:数数}” c=$((c+1)) 转移数数 别的 zip ${c}.zip "${@}" 转移$# 菲 完毕