Archivio zip con numero limitato di file


12

Quale comando posso usare per creare zips con un limite di numero di file? Ho una cartella (senza sottocartelle) di, per esempio, 5000 file, quindi vorrei un comando che potesse dividere quel numero e creare 10 singoli ziparchivi, ognuno composto da non più di 500 file.

Inoltre, non voglio che i 10 zipfile risultanti siano collegati tra loro, in modo da poterli aprire singolarmente e non dovrò aprirli tutti contemporaneamente.

Risposte:


13

È possibile utilizzare GNU parallel per farlo poiché può limitare il numero di elementi a un lavoro e fornire un numero di lavoro (per un nome univoco di archivio 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

L'opzione -N 5limita il numero di file a 5 per archivio e viene presentata al zipposto di{}

Il {#}(verbatim, che non deve essere sostituito da te durante l'invocazione), è sostituito dal numero del lavoro, risultante arch1.zip, arch2.zipecc.

L' -print0opzione finde l' -0opzione parallelin tandem assicurano che i nomi di file con caratteri speciali siano gestiti correttamente.


Ho ricevuto questo errore: i.imgur.com/JoyPrfY.png Da questo comando: trova *! -name "* .zip" -type f -print0 | parallel -0 -N 500 zip arch {13} {}
user8547

@ user8547 che non è GNU parallelo, ma il parallelo incluso in moreutils, è meglio compilare e installare dal sorgente per ottenere le ultime patch di sicurezza. ftp.gnu.org/gnu/parallel/parallel-latest.tar.bz2
Anthon

2
@ user8547 no, basta eseguire sudo apt-get install parallel.
terdon

2
@ user8547 perché arch{13}? Devi davvero usare il #personaggio. Che shell stai usando?
Anthon,

2
@ user8547 No, questo è il modo di dire in parallelo per inserire lì il numero del lavoro, felice che abbia funzionato.
Anthon,

1

Un'alternativa solo per shell: elaborare batch di COUNT file tramite "${@:START:COUNT}"(intervallo di parametri posizionali) e shift COUNTdurante l'incremento di un contatore cper nominare gli archivi:

impostato -- *
c = 1
while (($ #)); fare
  if [$ # -ge COUNT ]; poi
    zip $ {c} .zip "$ {@: 1: COUNT }"
    c = $ ((c + 1))
    sposta COUNT
  altro
    zip $ {c} .zip "$ {@}"
    sposta $ #
  fi
fatto

1

La risposta accettata ha funzionato perfettamente per me. :) MA, nel caso in cui non si abbia accesso al parallelo (chissà perché), ecco un'alternativa che avevo escogitato prima:

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

Il che creerà myarch1.zip, myarch2.zip, myarch3.zip, ecc. Potresti voler usare il trucco -0 suggerito da Anthon, se hai nomi di file strani.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.