เนื้อที่ดิสก์ไม่เพียงพอสำหรับการคลายซิปไฟล์ขนาด 50 GB ใน Ubuntu 16.04: ฉันสามารถแตกและลดขนาดไฟล์ zip ในเวลาเดียวกันได้หรือไม่?


0

ฉันมีไฟล์ซิป 50 GB ซึ่งมีภาพ jpg ประมาณ 50,000 ภาพ ไฟล์ jpgs นั้นถูก unzipped ประมาณ 55 GB ฉันใช้ Ubuntu 16.04

แต่ฉันมีขนาดดิสก์ 70 GB ในระบบนั้น ดังนั้นฉันได้รับข้อผิดพลาดของดิสก์ในระหว่างการคลาย

ฉันสามารถคลายซิปไฟล์และในขณะเดียวกันก็ลดขนาดไฟล์ zip (เช่นลบข้อมูลของ jpgs ที่ถูกคลายซิปแล้ว) เพื่อให้พอดีกับดิสก์ของฉันหรือไม่

--- มีคำถามเดียวกันสำหรับ Windows ---

บางคนมีคำถามเดียวกันที่แน่นอนสำหรับ Windows: unzip ไฟล์ในไดรฟ์ขนาดเล็ก

วิธีแก้ปัญหาที่เสนอนั้นน่าเสียดายที่ไม่สามารถแก้ปัญหาให้ฉันได้บน Linux (และดูเหมือนว่าจะไม่สามารถแก้ปัญหาได้ดีบน Windows) ดังนั้นฉันจะเก็บคำถามนี้ในกรณีที่มีทางออกที่ดีสำหรับ Linux ขอบคุณสำหรับความคิดเห็น


@Scott ขอบคุณสำหรับลิงค์ คำถามของฉันเหมือนกันทุกประการยกเว้นว่าฉันดู Ubuntu แทน Windows คำตอบนั้นไม่ได้ผลสำหรับฉัน (และไม่ได้แก้ปัญหาสำหรับ Windows ที่ดีเช่นกัน) ฉันควรปิดกระทู้นี้และถามคำถามติดตามที่นั่นหรือไม่ หรือเก็บไว้อันนี้เนื่องจากอาจมีโซลูชันเฉพาะของ Ubuntu ที่ใช้งานได้ ขอบคุณสำหรับความคิดเห็น.
tyrex

1
เก็บอันนี้ไว้เว้นแต่ว่าใครบางคนพบสิ่งที่ซ้ำซ้อนกับโซลูชัน Linux สำหรับตอนนี้เก็บคำถาม "คำถามติดตามผลที่นั่น" ไม่ตรงกับคำถาม & คำตอบแบบจำลองของเรา คุณไม่ควรถามคำถามที่คล้ายกันทั้งในความคิดเห็นและใน "คำตอบ"
Kamil Maciorowski

1
แค่เก็บอันนี้ไว้ อาจแก้ไขเพื่อบอกว่าคุณได้ดูคำถามอื่นแล้วและไม่ช่วยคุณ ขออภัยที่ทำเครื่องหมายคำถามของคุณเป็นคำถามซ้ำโดยไม่อ่านอย่างระมัดระวัง
Scott

คำตอบ:


0

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

ระบบไฟล์บางระบบไม่รองรับการโทรนี้ แต่ ext4 รองรับ

แนวคิดคือคุณแตกไฟล์ออกจากไฟล์เก็บถาวรจากนั้นใช้ fallocate เป็นศูนย์ในส่วนของไฟล์เก็บถาวรที่มีอยู่ พจนานุกรมของไฟล์เก็บถาวร zip เก็บออฟเซ็ตไปที่จุดเริ่มต้นของส่วนหัวของไฟล์แต่ละไฟล์และความยาวที่บีบอัดของไฟล์ภายในไฟล์เก็บถาวร

ตัวอย่างของแนวคิดนี่คือสคริปต์ Python3 ขั้นต่ำเพื่อแยกและทำการเรียกระบบในแต่ละไฟล์ คุณไม่ควรใช้งานโดยไม่ทำการทดสอบอย่างระมัดระวัง คุณอาจทำเช่นเดียวกันในเชลล์สคริปต์หากคุณสามารถดึงข้อมูล fallocate ไม่ได้อยู่ในไลบรารี Python มาตรฐานสำหรับฉันดังนั้นครึ่งแรกของสคริปต์ใช้ ctypes เพื่อเรียกมัน สคริปต์ต้องการไลบรารี python zipfile มันอาจต้องมีการเปลี่ยนแปลงอื่น ๆ สำหรับระบบของคุณ จำนวนเงินที่เป็นศูนย์ไม่รวมขนาดของส่วนหัวซึ่งจะหยุดพวกเขากลายเป็นหนึ่งในพื้นที่ที่ต่อเนื่องกัน

#!/usr/bin/python3
# https://superuser.com/a/1371106/458747
# int fallocate(int fd, int mode, off_t offset, off_t len)
import ctypes
libc = ctypes.cdll.LoadLibrary("libc.so.6")
fallocate = libc.fallocate
fallocate.argtypes = (ctypes.c_int, ctypes.c_int, ctypes.c_longlong, ctypes.c_longlong)
FALLOC_FL_PUNCH_HOLE = 2
FALLOC_FL_KEEP_SIZE = 1

import sys, subprocess, zipfile  # will need zlib for compression
myzip = sys.argv[1]
fd = open(myzip,"r+")
fno = fd.fileno()
zf = zipfile.ZipFile(myzip, 'r')
for info in zf.infolist():
   zf.extract(info)
   # print(info.header_offset,info.compress_size)
   rc = fallocate(fno, FALLOC_FL_PUNCH_HOLE|FALLOC_FL_KEEP_SIZE,
                  info.header_offset, info.compress_size)
   if rc!=0: print("fallocate failed\n")
   subprocess.call("ls -ls "+myzip,shell=True)

ฉันทดสอบมันในไฟล์ zip แบบง่าย ๆ และคุณสามารถเห็นจำนวนคอลัมน์ของบล็อกที่ถูกใช้โดยการลดขนาดไฟล์ในขณะที่แต่ละไฟล์ถูกแตกไฟล์:

24224 -rw-r--r--  25562742 Oct 29 22:56 ../my.zip
23292 -rw-r--r--  25562742 Oct 29 22:56 ../my.zip
22524 -rw-r--r--  25562742 Oct 29 22:56 ../my.zip
21524 -rw-r--r--  25562742 Oct 29 22:56 ../my.zip
...
2800 -rw-r--r--  25562742 Oct 29 22:56 ../my.zip
1868 -rw-r--r--  25562742 Oct 29 22:56 ../my.zip
880 -rw-r--r--  25562742 Oct 29 22:56 ../my.zip
124 -rw-r--r--  25562742 Oct 29 22:56 ../my.zip

0

คุณสามารถใช้ GNOME ในตัวArchive Managerเพื่อเปิดไฟล์ zip ได้โดยไม่ต้องแตกไฟล์ เมื่อคุณเปิดขึ้นมาคุณสามารถคัดลอกไฟล์ได้ประมาณ 10-15 GB ไปยังโฟลเดอร์ที่คุณต้องการแยกแล้วลบออกจากไฟล์เก็บถาวร ล้างและทำซ้ำ

มียูทิลิตี้หลายตัวที่มีฟังก์ชั่นนี้ (Archive-Mounter, Archivemount , GVFS , AVFS ) แต่ Archive Manager มี GUI ที่สะดวกมากและอาจจะใช้งานได้ง่ายที่สุด

หรือคุณสามารถแนบไดรฟ์ภายนอกและใช้เป็นที่เก็บข้อมูลชั่วคราว

หมายเหตุด้านข้าง: Windows มีความสามารถในการเมานต์ไฟล์ซิปในตัวฉันรู้สึกประหลาดใจที่ไม่มีใครชี้ให้เห็นสิ่งนี้ในหัวข้ออื่น

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