Arquivo Zip com número limitado de arquivos

12

Que comando posso usar para criar zips com um limite de número de arquivo? Eu tenho uma pasta (sem subpastas) de, digamos, 5000 arquivos, portanto, gostaria de um comando que pudesse dividir esse número e criar 10 ziparquivos individuais , cada um consistindo em não mais que 500 arquivos.

Também não quero que os 10 ziparquivos resultantes sejam conectados um ao outro, para que eu possa abri-los individualmente e não precise abrir todos os 10 ao mesmo tempo.

user8547
fonte

Respostas:

13

Você pode usar o GNU paralelo para fazer isso, pois pode limitar o número de elementos a um trabalho, bem como fornecer um número de trabalho (para um nome de arquivo zip exclusivo):

$ 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 5limita o número de arquivos a 5 por arquivo morto e é apresentada zipno lugar de{}

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

A -print0opção finde a -0opção parallelem conjunto garantem que os nomes de arquivos com caracteres especiais sejam manipulados corretamente.

Anthon
fonte
Eu recebi este erro: i.imgur.com/JoyPrfY.png A partir deste comando: localize *! -name "* .zip" -tipo f -print0 | paralelo -0 -N 500 zip arch {13} {}
user8547
@ user8547 que não é o paralelo GNU, mas o paralelo incluído no moreutils, é melhor compilar e instalar a partir da fonte para obter os patches de segurança mais recentes. ftp.gnu.org/gnu/parallel/parallel-latest.tar.bz2
Anthon
2
@ user8547 não, apenas corra sudo apt-get install parallel.
terdon
2
@ user8547 porque arch{13}? Você realmente precisa usar o #personagem. Qual shell você está usando?
Anthon
2
@ user8547 Não é assim que se pode dizer ao paralelo para colocar o número do trabalho, feliz por ter dado certo.
Anthon
1

Uma alternativa apenas ao shell: processe lotes de COUNT arquivos via "${@:START:COUNT}"(intervalo de parâmetros posicionais) e shift COUNTao incrementar um contador cpara nomear os arquivos:

set - *
c = 1
while (($ #)); Faz
  if [$ # -ge COUNT ]; então
    zip $ {c} .zip "$ {@: 1: COUNT }"
    c = $ ((c + 1))
    turno COUNT
  outro
    zip $ {c} .zip "$ {@}"
    shift $ #
  fi
feito
don_crissti
fonte
1

A resposta aceita funcionou perfeitamente bem para mim. :) MAS, caso você não tenha acesso ao paralelo (quem sabe o porquê), aqui está uma alternativa que eu já havia encontrado:

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

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

msb
fonte