Zip存档文件数量有限


12

我可以使用什么命令来创建zip文件数限制的?我有一个包含5000个文件的文件夹(没有子文件夹),所以我想要一个可以将该数字相除并创建10个单独的zip档案的命令,每个档案不超过500个文件。

我也不希望将生成的10个zip文件相互连接,以便我可以单独打开它们,而无需同时打开所有10个文件。

Answers:


13

您可以使用GNU parallel来执行此操作,因为它可以限制作业的元素数量并提供作业编号(用于唯一的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.ziparch2.zip等等。

串联的-print0选项find-0选项可parallel确保正确处理带有特殊字符的文件名。


我收到此错误:i.imgur.com/JoyPrfY.png通过此命令:find *!-name“ * .zip” -type f -print0 | parallel -0 -N 500 zip arch {13} {}
2014年

@ user8547不是GNU并行,而是moreutils中包含的并行,您最好从源代码进行编译和安装以获取最新的安全补丁。ftp.gnu.org/gnu/parallel/parallel-latest.tar.bz2
Anthon

2
@ user8547不,只是运行sudo apt-get install parallel
terdon

2
@ user8547为什么arch{13}?您确实需要使用#角色。您正在使用什么外壳?
Anthon 2014年

2
@ user8547不,这是告诉并行将作业号放在此处的方法,很高兴它得以解决。
Anthon 2014年

1

仅限外壳程序:通过(位置参数范围)处理一批COUNT个文件"${@:START:COUNT}"shift COUNT同时增加一个计数器c来命名档案:

设置-*
c = 1
而(($#)); 做
  如果[$#-ge COUNT ];然后
    zip $ {c} .zip“ $ {@:1:COUNT }”
    c = $((c + 1))
    转移COUNT
  其他
    zip $ {c} .zip“ $ {@}”
    移$#
  科幻
做完了

1

接受的答案对我来说非常好。:)但是,如果您无权访问并行(谁知道为什么),这是我之前想出的另一种选择:

find . ! -name '*.zip' -type f | xargs -n 500 | awk '{system("zip myarch"NR".zip "$0)}'

它将创建myarch1.zip,myarch2.zip,myarch3.zip等。如果文件名很奇怪,则可能要使用-0的Anthon建议技巧。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.