zip: Liste d'arguments trop longue (80 000 fichiers au total)

13

J'ai besoin de compresser 80 000 fichiers en plusieurs fichiers zip. Voici la commande que j'utilise:

zip -s 200M photos_test/*

Cependant, j'obtiens l'erreur suivante:

-bash: /usr/bin/zip: Argument list too long

Que puis-je faire pour résoudre le problème, outre le fractionnement manuel des fichiers de dossiers?

Merci

anévrisme
la source
L'erreur -bash: /usr/bin/zip: Argument list too longpeut provoquer dans le cas: 1- en raison de la non-utilisation du -rcommutateur, 2- trop de fichiers pour l'archivage. Ainsi, dans le premier cas, la réponse de @Mat est vraie et dans le second cas, la réponse de @ IgnacioVazquez-Abrams est vraie.
shgnInc

Réponses:

13

Si vous voulez le répertoire entier, vous pouvez simplement utiliser le -rcommutateur:

zip -r -s 200M myzip photos_test

Cela inclura tous les sous-répertoires de photos_testcependant.

Tapis
la source
J'ai fait ce que vous proposez et j'ai un petit myzip.zip (7mb) et les segments (200mb chacun). Cependant, je ne peux pas décompresser le contenu, j'exécute unzip unix myzip.zip mais j'obtiens un "mauvais décalage de fichier zip (lseek)". De plus, je dois également les extraire dans l'environnement Windows, et là, je n'ai que l'extracteur Windows 7, je suppose.
aneuryzm
ce sont des questions différentes, ouvrez une autre question pour cela (lien vers celle-ci pour référence). assurez-vous de publier les noms des fichiers zip générés (pas tous, mais d'abord et enfin au moins), et la ligne de commande exacte que vous utilisez.
Mat
9

Le problème semble être l'expansion du "*". Utilisez le nom du dossier ou ".":

Si vous souhaitez inclure le dossier racine dans le zip:

zip -r my.zip folder_with_80k_files

Si vous ne souhaitez pas inclure le dossier racine dans le zip:

cd folder_with_80k_files
zip -r my.zip .
stoffen
la source
5
find photos_test/ -mindepth 1 -maxdepth 1 | zip -@ -s 200M
Ignacio Vazquez-Abrams
la source
3
À utiliser find . -mindepth 1 -maxdepth -name '*.json' | zip {YOURZIPFILENAME}.zip -@si vous n'avez pas besoin de fractionner et que vous souhaitez sélectionner des fichiers par extension.
Daniel Sokolowski
3

ls photos_test | zip -s 200M -@ photos

  • -@fera en sorte que zip lise une liste de fichiers depuis stdin
  • |va diriger une sortie de lsdans l' entrée de zipcommande

man zip:

USE
⋮
   -@ file lists.  If a file list is specified as -@ [Not on MacOS], zip takes
   the  list  of  input  files from standard input instead of from the command
   line.  For example,

          zip -@ foo

   will store the files listed one per line on stdin in foo.zip.

   Under Unix, this option can be used to powerful effect in conjunction  with
   the  find (1)  command.   For example, to archive all the C source files in
   the current directory and its subdirectories:

          find . -name "*.[ch]" -print | zip source -@

   (note that the pattern must be quoted to keep the shell from expanding it).
⋮
M. Tao
la source