Zip Archive มีจำนวนไฟล์ จำกัด


12

ฉันสามารถใช้คำสั่งใดในการสร้างzips ด้วยการ จำกัด จำนวนไฟล์ ฉันมีโฟลเดอร์ (ไม่มีโฟลเดอร์ย่อย) ที่บอกว่ามีไฟล์ 5,000 ไฟล์ดังนั้นฉันต้องการคำสั่งที่สามารถแบ่งจำนวนนั้นและสร้างzipคลังเก็บ10 ไฟล์แต่ละไฟล์แต่ละไฟล์มีไฟล์ไม่เกิน 500 ไฟล์

ฉันไม่ต้องการให้zipไฟล์10 ไฟล์เชื่อมต่อกันเพื่อให้ฉันสามารถเปิดได้ทีละไฟล์และไม่จำเป็นต้องเปิดทั้ง 10 ไฟล์ในเวลาเดียวกัน

คำตอบ:


13

คุณสามารถใช้GNU ขนานในการทำเช่นนั้นเนื่องจากมันสามารถ จำกัด จำนวนองค์ประกอบให้กับงานรวมทั้งระบุหมายเลขงาน (สำหรับชื่อไฟล์เก็บถาวร zip ที่ไม่ซ้ำ):

$ touch $(seq 20)
$ find . ! -name "*.zip" -type f -print0 | parallel -0 -N 5 zip arch{#} {}
  adding: 1 (stored 0%)
  adding: 10 (stored 0%)
  adding: 11 (stored 0%)
  adding: 12 (stored 0%)
  adding: 13 (stored 0%)
  adding: 14 (stored 0%)
  adding: 15 (stored 0%)
  adding: 16 (stored 0%)
  adding: 17 (stored 0%)
  adding: 18 (stored 0%)
  adding: 19 (stored 0%)
  adding: 2 (stored 0%)
  adding: 20 (stored 0%)
  adding: 3 (stored 0%)
  adding: 4 (stored 0%)
  adding: 5 (stored 0%)
  adding: 6 (stored 0%)
  adding: 7 (stored 0%)
  adding: 8 (stored 0%)
  adding: 9 (stored 0%)
$ ls
1   11  13  15  17  19  20  4  6  8  arch1.zip  arch3.zip
10  12  14  16  18  2   3   5  7  9  arch2.zip  arch4.zip

ตัวเลือก-N 5จะ จำกัด จำนวนไฟล์ไว้ที่ 5 ต่อการเก็บถาวรและถูกนำเสนอzipแทน{}

{#}(คำต่อคำไม่ได้ที่จะถูกแทนที่ด้วยคุณในระหว่างอุทธรณ์) จะถูกแทนที่ด้วยจำนวนงานที่มีผลในarch1.zip, arch2.zipฯลฯ

-print0ตัวเลือกfindและ-0เลือกที่จะparallelตีคู่ให้แน่ใจว่าชื่อไฟล์ที่มีตัวอักษรพิเศษได้รับการจัดการอย่างถูกต้อง


ฉันได้รับข้อผิดพลาดนี้: i.imgur.com/JoyPrfY.pngจากคำสั่งนี้: find *! -name "* .zip" -type f -print0 | ขนาน -0 -N 500 zip arch {13} {}
user8547

@ user8547 ที่ไม่ใช่ GNU ขนาน แต่ขนานรวมอยู่ใน moreutils คุณควรรวบรวมและติดตั้งจากแหล่งที่ดีที่สุดเพื่อรับแพตช์ความปลอดภัยล่าสุด ftp.gnu.org/gnu/parallel/parallel-latest.tar.bz2
Anthon

2
@ user8547 sudo apt-get install parallelไม่เพียงเรียกใช้
terdon

2
@ user8547 ทำไมarch{13}? คุณต้องใช้#ตัวละครจริงๆ คุณใช้เปลือกอะไร
Anthon

2
@ user8547 ไม่เป็นวิธีบอกขนานเพื่อใส่หมายเลขงานที่นั่นดีใจที่ได้ผล
Anthon

1

ทางเลือกเฉพาะเชลล์: ประมวลผลแบทช์COUNTไฟล์ผ่าน"${@:START:COUNT}"(ช่วงของพารามิเตอร์ตำแหน่ง) และshift COUNTในขณะที่เพิ่มตัวนับcเพื่อตั้งชื่อไฟล์เก็บถาวร:

ชุด - *
c = 1
ในขณะที่ (($ #)); ทำ
  ถ้า [$ # -ge COUNT ]; แล้วก็
    zip $ {c} .zip "$ {@: 1: COUNT }"
    c = $ ((C + 1))
    เปลี่ยนCOUNT
  อื่น
    zip $ {c} .zip "$ {@}"
    กะ $ #
  Fi
เสร็จแล้ว

1

คำตอบที่ยอมรับนั้นใช้ได้ผลดีสำหรับฉัน :) แต่ในกรณีที่คุณไม่สามารถเข้าถึงแบบขนาน (ใครจะรู้ว่าทำไม) นี่เป็นทางเลือกที่ฉันเคยทำมาก่อน:

find . ! -name '*.zip' -type f | xargs -n 500 | awk '{system("zip myarch"NR".zip "$0)}'

ซึ่งจะสร้าง myarch1.zip, myarch2.zip, myarch3.zip ฯลฯ คุณอาจต้องการใช้ -0 หลอกลวง Anthon แนะนำถ้าคุณมีชื่อไฟล์แปลก

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