Arquivo Zip com número limitado de arquivos

10

Qual comando posso usar para criar zip s com um limite de número de arquivo? Eu tenho uma pasta (sem subpastas) de, digamos, 5000 arquivos, então eu gostaria de um comando que pudesse dividir esse número e criar 10 arquivos zip individuais, cada um contendo no máximo 500 arquivos.

Eu também não quero que os arquivos 10 zip resultantes sejam conectados uns aos outros, para que eu possa abri-los individualmente e não precise abrir todos os 10 ao mesmo tempo.

    
por user8547 09.11.2014 / 16:42

3 respostas

12

Você pode usar o paralelo GNU para fazer isso, pois ele pode limitar o número de elementos a um trabalho, bem como fornecer um número de trabalho (para um nome único de arquivo 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

A opção -N 5 limita o número de arquivos a 5 por arquivo e é apresentada a zip no lugar de {}

O {#} (literalmente, não deve ser substituído por você durante a chamada) é substituído pelo número do trabalho, resultando em arch1.zip , arch2.zip etc.

A opção -print0 para a opção find e -0 para parallel em conjunto garante que os nomes dos arquivos com caracteres especiais sejam tratados corretamente.

    
por 09.11.2014 / 16:55
1

Uma alternativa somente de shell: processar lotes de arquivos COUNT via "${@:START:COUNT}" (intervalo de parâmetros posicionais) e shift COUNT ao incrementar um contador c para nomear os arquivos:

set -- *
c=1
while (($#)); do
  if [ $# -ge COUNT ]; then
    zip ${c}.zip "${@:1:COUNT}"
    c=$((c+1))
    shift COUNT
  else
    zip ${c}.zip "${@}"
    shift $#
  fi
done
    
por 26.04.2016 / 16:22
1

A resposta aceita funcionou perfeitamente bem para mim. :) MAS, no caso de você não ter acesso ao paralelo (quem sabe por quê), aqui está uma alternativa que eu tinha antes:

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

Que criará myarch1.zip, myarch2.zip, myarch3.zip, etc Você pode querer usar o truque -0 que Anthon sugeriu, se você tem nomes estranhos de arquivos.

    
por 18.03.2017 / 02:56

Tags