zip: รายการอาร์กิวเมนต์ยาวเกินไป (80,000 ไฟล์โดยรวม)


14

ฉันต้องการบีบอัดไฟล์ 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

คำตอบ:


14

หากคุณต้องการไดเรกทอรีทั้งหมดคุณสามารถใช้-rสวิตช์:

zip -r -s 200M myzip photos_test

ซึ่งจะรวมถึงไดเรกทอรีย่อยทั้งหมดphotos_testด้วย


ฉันทำสิ่งที่คุณแนะนำและมี myzip.zip ขนาดเล็ก (7mb) และส่วน (200mb ต่อคน) อย่างไรก็ตามฉันไม่สามารถคลายซิปเนื้อหาฉันใช้ unzip unix myzip.zip แต่ฉันได้รับ "zipfile offset ที่ไม่ดี (lseek)" นอกจากนี้ฉันจำเป็นต้องแยกมันออกมาในสภาพแวดล้อม Windows เช่นกันและที่นั่นฉันมีตัวแยก Windows 7 ที่ฉันเดาเท่านั้น
aneuryzm

นั่นคือคำถามที่แตกต่างกันเปิดคำถามอีกอันสำหรับเรื่องนั้น (ลิงก์ไปยังคำถามนี้เพื่อการอ้างอิง) ตรวจสอบให้แน่ใจว่าคุณโพสต์ชื่อไฟล์ zip ที่สร้างขึ้น (ไม่ใช่ทั้งหมด แต่แรกและอย่างน้อยที่สุด) และบรรทัดคำสั่งที่แน่นอนที่คุณใช้
Mat

9

ปัญหาน่าจะเป็นการขยายตัวของ "*" ใช้ชื่อโฟลเดอร์หรือ ".":

หากคุณต้องการรวมโฟลเดอร์รากไว้ในรหัสไปรษณีย์:

zip -r my.zip folder_with_80k_files

หากคุณไม่ต้องการรวมโฟลเดอร์รากไว้ในรหัสไปรษณีย์:

cd folder_with_80k_files
zip -r my.zip .

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

3
ใช้find . -mindepth 1 -maxdepth -name '*.json' | zip {YOURZIPFILENAME}.zip -@หากคุณไม่ต้องการแยกและต้องการเลือกไฟล์ตามส่วนขยาย
Daniel Sokolowski

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).
⋮
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.