zip: Danh sách đối số quá dài (tổng cộng 80.000 tệp)


13

Tôi cần nén 80.000 tệp thành nhiều tệp zip. Đây là lệnh tôi sử dụng:

zip -s 200M photos_test/*

Tuy nhiên tôi nhận được lỗi sau:

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

Tôi có thể làm gì để giải quyết vấn đề, bên cạnh việc chia thủ công các tệp thư mục?

cảm ơn


Lỗi -bash: /usr/bin/zip: Argument list too longcó thể gây ra trong trường hợp: 1- vì không sử dụng -rchuyển đổi, 2- có quá nhiều tệp để lưu trữ. Vì vậy, trong trường hợp đầu tiên, câu trả lời của @ Mat là đúng và trong trường hợp thứ hai, câu trả lời của @ IgnacioVazquez-Abrams là đúng.
shgnInc

Câu trả lời:


13

Nếu bạn muốn toàn bộ thư mục, bạn chỉ cần sử dụng -rchuyển đổi:

zip -r -s 200M myzip photos_test

Điều đó sẽ bao gồm tất cả các thư mục con photos_testmặc dù.


Tôi đã thực hiện những gì bạn đề xuất và tôi có một myzip.zip (7mb) nhỏ và các phân đoạn (mỗi phân đoạn 200mb). Tuy nhiên, tôi không thể giải nén nội dung, tôi đang giải nén unix myzip.zip nhưng tôi nhận được "offset zipfile xấu (lseek)". Hơn nữa, tôi cũng cần phải giải nén chúng trong môi trường Windows và tôi chỉ có trình trích xuất Windows 7.
aneuryzm

đó là những câu hỏi khác nhau, mở một câu hỏi khác cho điều đó (liên kết đến câu hỏi này để tham khảo). đảm bảo bạn đăng tên của các tệp zip đã tạo (không phải tất cả chúng, nhưng ít nhất là đầu tiên và cuối cùng) và dòng lệnh chính xác mà bạn sử dụng.
Mat

9

Vấn đề dường như là sự mở rộng của "*". Sử dụng tên thư mục hoặc ".":

Nếu bạn muốn bao gồm thư mục gốc trong zip:

zip -r my.zip folder_with_80k_files

Nếu bạn không muốn bao gồm thư mục gốc bên trong zip:

cd folder_with_80k_files
zip -r my.zip .

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

2
Sử dụng find . -mindepth 1 -maxdepth -name '*.json' | zip {YOURZIPFILENAME}.zip -@nếu bạn không cần phải phân tách và muốn chọn tệp theo tiện ích mở rộng.
Daniel Sokolowski

3

ls photos_test | zip -s 200M -@ photos

  • -@sẽ khiến zip đọc danh sách các tệp từ stdin
  • |ý ống một đầu ra của lsvào đầu vào của ziplệnh

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).
⋮
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.