zip: elenco degli argomenti troppo lungo (80.000 file in totale)


13

Ho bisogno di comprimere 80.000 file in più file zip. Questo è il comando che uso:

zip -s 200M photos_test/*

Tuttavia ottengo il seguente errore:

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

Cosa posso fare per risolvere il problema, oltre a dividere manualmente i file delle cartelle?

Grazie


L'errore -bash: /usr/bin/zip: Argument list too longpuò causare nel caso: 1- perché non si utilizza -rswitch, 2- ci sono troppi file per l'archiviazione. Quindi nel primo caso la risposta di @ Mat è vera e nel secondo caso la risposta di @ IgnacioVazquez-Abrams è vera.
shgnInc,

Risposte:


13

Se vuoi l'intera directory, puoi semplicemente usare l' -ropzione:

zip -r -s 200M myzip photos_test

Ciò includerà tutte le sottodirectory di photos_testperò.


Ho fatto quello che mi hai suggerito e ho un piccolo myzip.zip (7mb) e i segmenti (200mb ciascuno). Tuttavia, non riesco a decomprimere il contenuto, sto eseguendo decomprimere unix myzip.zip ma ottengo "offset zipfile non valido (lseek)". Inoltre, ho bisogno di estrarli anche in ambiente Windows, e lì ho solo l'estrattore di Windows 7 credo.
aneuryzm,

quelle sono domande diverse, apri un'altra domanda per quello (link a questo per riferimento). assicurati di pubblicare i nomi dei file zip generati (non tutti, ma almeno il primo e l'ultimo) e l' esatta riga di comando che usi.
Mat

9

Il problema sembra essere l'espansione del "*". Usa il nome della cartella o ".":

Se vuoi includere la cartella principale nella zip:

zip -r my.zip folder_with_80k_files

Se non vuoi includere la cartella principale nella zip:

cd folder_with_80k_files
zip -r my.zip .

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

3
Utilizzare find . -mindepth 1 -maxdepth -name '*.json' | zip {YOURZIPFILENAME}.zip -@se non è necessario suddividere e si desidera selezionare i file per estensione.
Daniel Sokolowski,

3

ls photos_test | zip -s 200M -@ photos

  • -@farà in modo che zip legga un elenco di file da stdin
  • |Tubo volontà un'uscita del lsin ingresso di 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).
⋮
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.