แยกไฟล์โดยใช้ tar, gz, zip หรือ bzip2 [ปิด]


144

ฉันต้องการบีบอัดไฟล์ขนาดใหญ่ประมาณ 17-20 GB ฉันต้องแบ่งไฟล์ออกเป็นหลายไฟล์ประมาณ 1GB ต่อไฟล์

ฉันค้นหาวิธีการแก้ปัญหาผ่าน Google และพบวิธีการใช้splitและcatคำสั่ง แต่พวกเขาไม่สามารถใช้งานไฟล์ขนาดใหญ่ได้เลย นอกจากนี้พวกมันจะไม่ทำงานใน Windows ฉันต้องการที่จะดึงมันบนเครื่อง Windows


3
ฉันรู้สึกเจ็บปวดของคุณ แต่นี่ดูเหมือนจะไม่เกี่ยวข้องกับการเขียนโปรแกรม
46499 Jason S

1
โปรแกรมบีบอัดจำนวนมาก (เช่น 7-Zip) สามารถแยกไฟล์บีบอัดเป็นโวลุ่มที่มีขนาดตามที่ระบุเพื่อการกระจายที่ง่ายขึ้น
Martin Liversage

นี่เป็นของ superuser.com แต่เบต้าส่วนตัวยังไม่เริ่มจนกว่าพรุ่งนี้ฉันจะบอก
JesperE

ฉันขอถามได้ไหมว่าทำไมคุณถึงต้องการบีบอัดไฟล์
Jan Jungnickel

หากหนึ่งในสองโซลูชั่นที่ทำงานได้ที่โพสต์ที่นี่ไม่ได้เลื่อนออกไปเขาจะต้องมีโซลูชันการเขียนโปรแกรม
Joshua

คำตอบ:


253

คุณสามารถใช้splitคำสั่งพร้อม-bตัวเลือก:

split -b 1024m file.tar.gz

สามารถประกอบขึ้นใหม่บนเครื่อง Windows โดยใช้คำตอบของ@ Joshua

copy /b file1 + file2 + file3 + file4 filetogether

แก้ไข : ตามที่ @Charlie ระบุไว้ในความคิดเห็นด้านล่างคุณอาจต้องการตั้งค่าส่วนนำหน้าอย่างชัดเจนเนื่องจากจะใช้เป็นxอย่างอื่นซึ่งอาจทำให้เกิดความสับสน

split -b 1024m "file.tar.gz" "file.tar.gz.part-"

// Creates files: file.tar.gz.part-aa, file.tar.gz.part-ab, file.tar.gz.part-ac, ...

แก้ไข : การแก้ไขโพสต์เนื่องจากคำถามถูกปิดและโซลูชันที่มีประสิทธิภาพมากที่สุดอยู่ใกล้กับเนื้อหาของคำตอบนี้มาก:

# create archives
$ tar cz my_large_file_1 my_large_file_2 | split -b 1024MiB - myfiles_split.tgz_
# uncompress
$ cat myfiles_split.tgz_* | tar xz

วิธีนี้จะช่วยหลีกเลี่ยงความจำเป็นในการใช้ไฟล์ขนาดใหญ่ระดับกลางเมื่อทำการบีบอัด ใช้อ็อพชัน tar -C เพื่อใช้ไดเร็กทอรีอื่นสำหรับไฟล์ผลลัพธ์ btw ถ้าไฟล์เก็บถาวรประกอบด้วยไฟล์เพียงไฟล์เดียว tar สามารถหลีกเลี่ยงได้และใช้ gzip เท่านั้น:

# create archives
$ gzip -c my_large_file | split -b 1024MiB - myfile_split.gz_
# uncompress
$ cat myfile_split.gz_* | gunzip -c > my_large_file

สำหรับ windows คุณสามารถดาวน์โหลดคำสั่งเดียวกันในเวอร์ชัน ported หรือใช้ cygwin


7
หากคุณไม่ได้เพิ่มคำนำหน้าเป็นอาร์กิวเมนต์สุดท้ายหลังจากชื่อไฟล์ที่จะแยกคุณจะได้รับผลลัพธ์ในไฟล์ชื่อ xaa, xab, xac, xad ....
Charlie

@ Charlie ขอบคุณฉันอัพเดตคำตอบแล้ว
matpie

2
การใช้งานจริง-b 1024MiBทำให้เกิดข้อผิดพลาดว่าเป็นจำนวนไบต์ที่ไม่ถูกต้อง การใช้--bytes=1024mผลงาน
Brian

และคุณไม่จำเป็นต้องใช้catประกอบไฟล์อีกครั้ง คุณสามารถใช้copy /b file1 + file2 + etc..บน Windows จากนั้นคัดลอกกลับไปที่ Linux และ tar สามารถอ่าน tarball ที่ประกอบขึ้นใหม่ได้ ฉันแค่ลองมัน
Brian

1
แยกมีตัวเลือก--numeric-suffixes: ใช้ส่วนต่อท้ายที่เป็นตัวเลขแทนตัวอักษร
ดร. Jan-Philip Gehrcke

27

หากคุณแยกออกจาก Linux คุณยังสามารถรวมกันอีกครั้งใน Windows

copy /b file1 + file2 + file3 + file4 filetogether

นอกจากนี้คุณยังสามารถใช้copy /b file* filetogether- support.microsoft.com/kb/71161
eug

5
ทำงานได้อย่างถูกต้องเฉพาะใน NTFS และหากไฟล์อยู่ในลำดับการเรียง NTFS แล้ว ลองใช้กับ FAT หรือ FAT32 = ความเจริญ
Joshua

+1 ทำให้แน่ใจว่าไฟล์อยู่ในลำดับที่ถูกต้อง!
Brian

@Joshua เพื่อความยุติธรรมถ้าไม่เช่นนั้นคุณได้ตั้งชื่องานไม่ดี
jpmc26

@ jpmc26: คุณรู้เกี่ยวกับนิสัยการเรียงลำดับไดเรกทอรีที่ไม่ถูกต้องของ FAT32 ใช่มั้ย
Joshua


8

รหัสที่ทดสอบแล้วเริ่มแรกสร้างไฟล์เก็บถาวรเดียวแล้วแยกมัน:

 gzip -c file.orig > file.gz
 CHUNKSIZE=1073741824
 PARTCNT=$[$(stat -c%s file.gz) / $CHUNKSIZE]

 # the remainder is taken care of, for example for
 # 1 GiB + 1 bytes PARTCNT is 1 and seq 0 $PARTCNT covers
 # all of file
 for n in `seq 0 $PARTCNT`
 do
       dd if=file.gz of=part.$n bs=$CHUNKSIZE skip=$n count=1
 done

ตัวแปรนี้ละเว้นการสร้างไฟล์เก็บถาวรเดียวและตรงไปที่การสร้างชิ้นส่วน:

gzip -c file.orig |
    ( CHUNKSIZE=1073741824;
        i=0;
        while true; do
            i=$[i+1];
            head -c "$CHUNKSIZE" > "part.$i";
            [ "$CHUNKSIZE" -eq $(stat -c%s "part.$i") ] || break;
        done; )

ในตัวแปรนี้หากขนาดไฟล์ของไฟล์เก็บถาวรหารด้วย$CHUNKSIZEแล้วไฟล์บางส่วนสุดท้ายจะมีขนาดไฟล์ 0 ไบต์


1
นั่นคือสิ่งที่splitทำไปแล้ว
ephemient

1
ephemient เฮ้ฉันขุดข้อความหามันแล้ว ฉันไม่มีคำสั่ง / ไบนารีแยก / zip ในอุปกรณ์บางอย่างและอันนี้ทำงานได้อย่างสมบูรณ์ ฉันจะเตรียมรหัสนี้ให้ทำงานเป็นคำสั่ง split :) ขอบคุณมาก @Adrian Panasiuk นั่นเป็นข้อบกพร่องสำหรับฉัน
m3nda

@ erm3nda ไม่เป็นไรดีใจที่ช่วยได้!
Adrian Panasiuk

แต่ฉันได้ทดสอบแล้วและผลลัพธ์ก็เป็นไฟล์เต็มไม่แยก มันจะเป็นอย่างไร เป็นไฟล์ขนาดใหญ่บนอุปกรณ์ขนาดเล็กดังนั้นจึงเป็นกระบวนการที่ยาว โปรดทดสอบวิธีแก้ปัญหาของคุณขณะโพสต์ :(
m3nda

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