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


13

Мне нужно сжать 80 000 файлов в несколько файлов ZIP. Это команда, которую я использую:

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

Ответы:


13

Если вы хотите весь каталог, вы можете просто использовать -rпереключатель:

zip -r -s 200M myzip photos_test

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


Я сделал то, что вы предлагаете, и у меня есть небольшой myzip.zip (7 МБ) и сегменты (200 МБ каждый). Тем не менее, я не могу разархивировать содержимое, я запускаю unzip unix myzip.zip, но получаю "bad zipfile offset (lseek)". Кроме того, мне нужно извлечь их в среде Windows, и там, я думаю, у меня есть только Windows 7 Extractor.
aneuryzm

это разные вопросы, откройте другой вопрос для этого (ссылка на этот вопрос для справки). убедитесь, что вы публикуете имена сгенерированных 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.