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

9493
aneuryzm

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

zip -s 200M photos_test/* 

Однако я получаю следующую ошибку:

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

Что я могу сделать, чтобы решить проблему, кроме разделения файлов папки вручную?

Спасибо

11
Ошибка `-bash: / usr / bin / zip: список аргументов слишком длинная` может привести к тому, что: 1- из-за неиспользования ключа -r, 2- слишком много файлов для архивирования. Таким образом, в первом случае ответ @ Mat является правдой, а во втором случае ответ @ IgnacioVazquez-Abrams является верным. shgnInc 9 лет назад 0

4 ответа на вопрос

11
Mat

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

zip -r -s 200M myzip photos_test 

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

Я сделал то, что вы предлагаете, и у меня есть небольшой myzip.zip (7 МБ) и сегменты (200 МБ каждый). Тем не менее, я не могу разархивировать содержимое, я запускаю unzip unix myzip.zip, но получаю «плохое смещение zipfile (lseek)». Кроме того, мне нужно извлечь их в среде Windows, и там, я думаю, у меня есть только Windows 7 Extractor. aneuryzm 13 лет назад 0
это разные вопросы, откройте другой вопрос для этого (ссылка на этот вопрос для справки). убедитесь, что вы публикуете имена сгенерированных zip-файлов (не все из них, но, по крайней мере, первый и последний), а также ** точную ** командную строку, которую вы используете. Mat 13 лет назад 0
7
stoffen

Кажется, проблема в расширении "*". Используйте имя папки или «.»:

Если вы хотите включить корневую папку в zip:

zip -r my.zip folder_with_80k_files 

Если вы не хотите включать корневую папку в zip-архив:

cd folder_with_80k_files zip -r my.zip . 
4
Ignacio Vazquez-Abrams
find photos_test/ -mindepth 1 -maxdepth 1 | zip -@ -s 200M 
Используйте `найти. -mindepth 1 -maxdepth -name '* .json' | zip .zip - @ `, если вам не нужно разбивать и хотите выбирать файлы по расширению. Daniel Sokolowski 6 лет назад 1
1
Mr. Tao

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). ⋮ 

Похожие вопросы