Archive Zip avec un nombre limité de fichiers

12

Quelle commande puis-je utiliser pour créer des zips avec une limite de nombre de fichiers? J'ai un dossier (pas de sous-dossiers) de, disons, 5000 fichiers, donc je voudrais une commande qui pourrait diviser ce nombre et créer 10 ziparchives individuelles , chacune ne comprenant pas plus de 500 fichiers.

Je ne veux pas non plus que les 10 zipfichiers résultants soient connectés les uns aux autres, de sorte que je puisse les ouvrir individuellement et je n'aurai pas besoin d'ouvrir les 10 en même temps.

user8547
la source

Réponses:

13

Vous pouvez utiliser GNU parallel pour le faire car cela peut limiter le nombre d'éléments à un travail ainsi que fournir un numéro de travail (pour un nom d'archive zip unique):

$ 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'option -N 5limite le nombre de fichiers à 5 par archive et est présentée à la zipplace de{}

Le {#}(mot à mot, à ne pas remplacer par vous lors de l'invocation), est remplacé par le numéro de travail, ce qui entraîne arch1.zip, arch2.zipetc.

L' -print0option to findet l' -0option to parallelin tandem s'assurent que les noms de fichiers avec des caractères spéciaux sont correctement gérés.

Anthon
la source
J'ai eu cette erreur: i.imgur.com/JoyPrfY.png A partir de cette commande: trouver *! -nom "* .zip" -type f -print0 | arc de zip parallèle -0-N 500 {13} {}
user8547
@ user8547 qui n'est pas parallèle à GNU, mais le parallèle inclus dans moreutils, il est préférable de compiler et d'installer à partir des sources pour obtenir les derniers correctifs de sécurité. ftp.gnu.org/gnu/parallel/parallel-latest.tar.bz2
Anthon
2
@ user8547 non, lancez-le sudo apt-get install parallel.
terdon
2
@ user8547 pourquoi arch{13}? Vous devez vraiment utiliser le #personnage. Quel shell utilisez-vous?
Anthon
2
@ user8547 Non, c'est la façon de dire en parallèle de mettre le numéro de travail là-bas, heureux que cela ait fonctionné.
Anthon
1

Une alternative uniquement shell: traiter des lots de fichiers COUNT via "${@:START:COUNT}"(plage de paramètres de position) et shift COUNTen incrémentant un compteur cpour nommer les archives:

ensemble -- *
c = 1
while (($ #)); faire
  if [$ # -ge COUNT ]; puis
    zip $ {c} .zip "$ {@: 1: COUNT }"
    c = $ ((c + 1))
    shift COUNT
  autre
    zip $ {c} .zip "$ {@}"
    shift $ #
  Fi
terminé
don_crissti
la source
1

La réponse acceptée a parfaitement fonctionné pour moi. :) MAIS, au cas où vous n'auriez pas accès au parallèle (qui sait pourquoi), voici une alternative que j'avais trouvée auparavant:

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

Ce qui créera myarch1.zip, myarch2.zip, myarch3.zip, etc. Vous voudrez peut-être utiliser l'astuce -0 proposée par Anthon, si vous avez des noms de fichiers étranges.

msb
la source