zip: Lista de argumentos demasiado larga (80,000 archivos en total)


13

Necesito comprimir 80,000 archivos en múltiples archivos zip. Este es el comando que uso:

zip -s 200M photos_test/*

Sin embargo me sale el siguiente error:

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

¿Qué puedo hacer para resolver el problema, además de dividir manualmente los archivos de la carpeta?

Gracias


El error -bash: /usr/bin/zip: Argument list too longpuede causar en el caso: 1- por no usar el -rinterruptor, 2- hay demasiados archivos para archivar. Entonces, en el primer caso, la respuesta de @ Mat es verdadera y en el segundo caso, la respuesta de @ IgnacioVazquez-Abrams es verdadera.
shgnInc

Respuestas:


13

Si desea todo el directorio, simplemente puede usar el -rinterruptor:

zip -r -s 200M myzip photos_test

Eso incluirá todos los subdirectorios de photos_testaunque.


He hecho lo que sugieres y tengo un pequeño myzip.zip (7mb) y los segmentos (200mb cada uno). Sin embargo, no puedo descomprimir el contenido, estoy ejecutando unzip unix myzip.zip pero obtengo un "desplazamiento incorrecto del archivo zip (lseek)". Además, también necesito extraerlos en el entorno de Windows, y supongo que solo tengo un extractor de Windows 7.
aneuryzm

esas son preguntas diferentes, abra otra pregunta para eso (enlace a esta para referencia) asegúrese de publicar los nombres de los archivos zip generados (no todos, pero primero y al menos al final) y la línea de comando exacta que utiliza.
Mat

9

El problema parece ser la expansión del "*". Utilice el nombre de la carpeta o ".":

Si desea incluir la carpeta raíz dentro del zip:

zip -r my.zip folder_with_80k_files

Si no desea incluir la carpeta raíz dentro del zip:

cd folder_with_80k_files
zip -r my.zip .

5
find photos_test/ -mindepth 1 -maxdepth 1 | zip -@ -s 200M

3
Úselo find . -mindepth 1 -maxdepth -name '*.json' | zip {YOURZIPFILENAME}.zip -@si no necesita dividir y desea seleccionar archivos por extensión.
Daniel Sokolowski

3

ls photos_test | zip -s 200M -@ photos

  • -@hará que zip lea una lista de archivos de stdin
  • |tubo voluntad una salida de lsen la entrada de zipcomando

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).
⋮
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.