zip: список аргументів занадто довгий (загалом 80 000 файлів)


14

Мені потрібно стиснути 80 000 файлів у кілька поштових файлів. Це команда, яку я використовую:

zip -s 200M photos_test/*

Однак я отримую таку помилку:

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

Що я можу зробити, щоб вирішити проблему, крім розділення файлів папок вручну?

Дякую


Помилка -bash: /usr/bin/zip: Argument list too longможе спричинити у випадку: 1- через те, що не використовується -rперемикач, 2- є занадто багато файлів для архівації. Отже, у першому випадку відповідь @ Mat відповідає дійсності, а у другому - відповідь @ IgnacioVazquez-Abrams.
shgnInc

Відповіді:


14

Якщо ви хочете весь каталог, ви можете просто використовувати -rперемикач:

zip -r -s 200M myzip photos_test

Це буде включати всі підкаталоги, photos_testхоча.


Я зробив те, що ви пропонуєте, і у мене є невеликий myzip.zip (7mb) і сегменти (200mb кожен). Однак я не можу розпакувати вміст, я запускаю unzip unix myzip.zip, але я отримую "поганий зсув zipfile (lseek)". Крім того, мені потрібно витягти їх і в середовищі Windows, і там я маю лише витяжку Windows 7.
аневризм

це різні питання, відкрийте для цього ще одне питання (посилання на це для довідки). переконайтеся, що ви розміщуєте імена згенерованих zip-файлів (не всіх, але перших та останніх принаймні) та точного командного рядка, який ви використовуєте.
Мат

9

Здається, проблема полягає в розширенні "*". Використовуйте ім'я папки або ".":

Якщо ви хочете включити кореневу папку в zip:

zip -r my.zip folder_with_80k_files

Якщо ви не хочете включати кореневу папку всередині zip:

cd folder_with_80k_files
zip -r my.zip .


3

ls photos_test | zip -s 200M -@ photos

  • -@змусить zip прочитати список файлів із stdin
  • |будеш конвеєр вихід з lsв вхід з zipкоманди

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).
⋮
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.