zip: lista de argumentos muito longa (80.000 arquivos no total)


13

Preciso compactar 80.000 arquivos em vários arquivos zip. Este é o comando que eu uso:

zip -s 200M photos_test/*

No entanto, recebo o seguinte erro:

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

O que posso fazer para resolver o problema, além de dividir manualmente os arquivos da pasta?

obrigado


O erro -bash: /usr/bin/zip: Argument list too longpode causar no caso: 1 - por não usar o -rswitch, 2 - há muitos arquivos para arquivamento. Assim, no primeiro caso, a resposta de @ Mat é verdadeira e, no segundo caso, a resposta de @ IgnacioVazquez-Abrams é verdadeira.
shgnInc

Respostas:


13

Se você quiser o diretório inteiro, você pode simplesmente usar a -ropção:

zip -r -s 200M myzip photos_test

Isso incluirá todos os subdiretórios photos_test.


Fiz o que você sugere e tenho um pequeno myzip.zip (7mb) e os segmentos (200mb cada). No entanto, não consigo descompactar o conteúdo, estou descompactando o unix myzip.zip, mas recebo "deslocamento incorreto do arquivo zip (lseek)". Além disso, preciso extraí-los também no ambiente Windows, e acho que só tenho o extrator do Windows 7.
Aneuryzm

essas são perguntas diferentes, abra outra questão para isso (link para este para referência). publique os nomes dos arquivos zip gerados (não todos, mas primeiro e último pelo menos) e a linha de comando exata que você usa.
19411 Mat

9

O problema parece ser a expansão do "*". Use o nome da pasta ou ".":

Se você deseja incluir a pasta raiz no zip:

zip -r my.zip folder_with_80k_files

Se você não deseja incluir a pasta raiz dentro do zip:

cd folder_with_80k_files
zip -r my.zip .

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

3
Use find . -mindepth 1 -maxdepth -name '*.json' | zip {YOURZIPFILENAME}.zip -@se você não precisar dividir e quiser selecionar arquivos por extensão.
Daniel Sokolowski

3

ls photos_test | zip -s 200M -@ photos

  • -@fará com que o zip leia uma lista de arquivos do stdin
  • |tubo vontade uma saída de lsna 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).
⋮
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.