zip: Argumentliste zu lang (insgesamt 80.000 Dateien)

14

Ich muss 80.000 Dateien in mehrere Zip-Dateien komprimieren. Dies ist der Befehl, den ich benutze:

zip -s 200M photos_test/*

Ich erhalte jedoch den folgenden Fehler:

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

Was kann ich tun, um das Problem zu lösen, außer die Ordnerdateien manuell zu teilen?

Vielen Dank

aneuryzm
quelle
Der Fehler -bash: /usr/bin/zip: Argument list too longkann in folgenden Fällen Folgendes verursachen: 1- Da kein -rSwitch verwendet wird, 2- gibt es zu viele Dateien für die Archivierung. Im ersten Fall ist die Antwort von @ Mat wahr und im zweiten Fall ist die Antwort von @ IgnacioVazquez-Abrams wahr.
shgnInc

Antworten:

14

Wenn Sie das gesamte Verzeichnis möchten, können Sie einfach den -rSchalter verwenden:

zip -r -s 200M myzip photos_test

Dies schließt jedoch alle Unterverzeichnisse von ein photos_test.

Matte
quelle
Ich habe getan, was Sie vorschlagen, und ich habe eine kleine myzip.zip (7 MB) und die Segmente (jeweils 200 MB). Ich kann den Inhalt jedoch nicht entpacken. Ich verwende Unzip myix.zip entpacken, erhalte jedoch "Bad Zipfile Offset (lseek)". Außerdem muss ich sie auch in der Windows-Umgebung extrahieren, und dort habe ich wohl nur Windows 7-Extraktor.
aneuryzm
Das sind verschiedene Fragen, öffnen Sie eine andere Frage dafür (Link zu dieser als Referenz). Stellen Sie sicher, dass Sie die Namen der generierten Zip-Dateien (nicht alle, aber mindestens die ersten und letzten) und die genaue Befehlszeile, die Sie verwenden, veröffentlichen.
Mat
9

Das Problem scheint die Erweiterung des "*" zu sein. Verwenden Sie den Ordnernamen oder ".":

Wenn Sie den Stammordner in die Zip-Datei aufnehmen möchten:

zip -r my.zip folder_with_80k_files

Wenn Sie den Stammordner nicht in die Zip-Datei aufnehmen möchten:

cd folder_with_80k_files
zip -r my.zip .
stoffen
quelle
5
find photos_test/ -mindepth 1 -maxdepth 1 | zip -@ -s 200M
Ignacio Vazquez-Abrams
quelle
3
Verwenden find . -mindepth 1 -maxdepth -name '*.json' | zip {YOURZIPFILENAME}.zip -@Sie diese Option, wenn Sie nicht teilen müssen und Dateien nach Erweiterung auswählen möchten.
Daniel Sokolowski
3

ls photos_test | zip -s 200M -@ photos

  • -@bewirkt, dass zip eine Liste von Dateien aus stdin liest
  • |leitet eine Ausgabe von lsin die Eingabe des zipBefehls weiter

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).
⋮
Herr Tao
quelle