สร้างไฟล์เก็บถาวร tar แยกออกเป็นบล็อกที่มีขนาดสูงสุด


83

ฉันต้องการสำรองข้อมูลไดเรกทอรีที่ค่อนข้างใหญ่ แต่ฉันถูก จำกัด ด้วยขนาดของไฟล์แต่ละไฟล์ ฉันต้องการสร้างtar.(gz|bz2)ไฟล์เก็บถาวรซึ่งแบ่งออกเป็นไฟล์เก็บถาวรสูงสุด 200MB Clonezilla ทำสิ่งที่คล้ายกันนี้โดยแยกการสำรองข้อมูลอิมเมจชื่อดังนี้:

sda1.backup.tar.gz.aa
sda1.backup.tar.gz.ab
sda1.backup.tar.gz.ac

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


คำถามที่เกี่ยวข้อง: superuser.com/q/290986/11574
sampablokuper

คำตอบ:


108

คุณสามารถไปป์ tar ที่คำสั่ง split:

tar cvzf - dir/ | split --bytes=200MB - sda1.backup.tar.gz.

ในระบบ * nix บางระบบ (เช่น OS X) คุณอาจได้รับข้อผิดพลาดต่อไปนี้:

split: illegal option -- -

ในกรณีนี้ลองใช้วิธีนี้ (หมายเหตุ-b 200m):

tar cvzf - dir/ | split -b 200m - sda1.backup.tar.gz.

หากคุณพยายามแบ่งไฟล์ให้พอดีกับไดรฟ์ที่จัดรูปแบบ FAT32 ให้ใช้ขีด จำกัด ไบต์ที่ 4294967295 ตัวอย่างเช่น:

tar cvzf - /Applications/Install\ macOS\ Sierra.app/ | \
split -b 4294967295 - /Volumes/UNTITLED/install_macos_sierra.tgz.

3
ที่ดี! ฉันจะแตกไฟล์เก็บถาวรได้อย่างไร
Naftuli Kay

24
จะcat sda1.backup.tar.gz.* | tar xzvf -ทำงานหรือไม่
Naftuli Kay

3
ใช่มันควรจะเป็น splitโดยค่าเริ่มต้นตั้งชื่อไฟล์เพื่อให้เมื่อเรียงตาม LOCALE (ซึ่งทำโดย shell globbing) จะอยู่ในลำดับที่ถูกต้อง
จอร์แดน

4
โดยไม่ต้อง verbose เพียงทำtar czf ...โดยไม่ต้องvและผสานโดยโดยไม่ต้องcat backup.tar.gz.* | tar tar xzf - ผมเห็นประโยชน์ของการส่งออกอย่างละเอียดที่นี่ไม่มีโดยv v
LéoLéopold Hertz 준영

1
เพิ่งช่วยเพื่อนด้วยการบรรจุ Xcode ลงในแฟลชไดรฟ์ที่มีการจัดรูปแบบ FAT32 ด้วย: tar cvzf - Xcode.app/ | split -b 2000m - /Volumes/PH/xcode/xcode.tgz(ใช้จากcd /Applications/) ขอบคุณมาก :)
ecth


4

เพียงเพิ่ม: เนื่องจากขนาดไฟล์สูงสุดที่อนุญาตใน vfat / fat32 คือ 2 ^ 32 ลบ 1 (4294967295 ไบต์) คำสั่ง split พร้อมขนาดไฟล์สูงสุดที่อนุญาตในระบบไฟล์ดังกล่าวคือ:

split -b4294967295 -d my_input_file my_output_file_splitted

3
serega@serega-sv:~$ tar -c  -M --tape-length=1024 --file /tmp/pseudo-tape.tar --new-volume-script=/tmp/new-volume.sh --volno-file=/tmp/volno /tmp/stuff-to-archive 
tar: Removing leading `/' from member names
moving /tmp/pseudo-tape.tar to /tmp/archive.1
moving /tmp/pseudo-tape.tar to /tmp/archive.2
moving /tmp/pseudo-tape.tar to /tmp/archive.3

คุณจะต้องมีสคริปต์สำหรับการย้ายไฟล์ pseudo-tape.tar แบบอัตโนมัติไปยังชื่อใหม่:

serega@serega-sv:~$ cat /tmp/new-volume.sh 
dir="/tmp"
base_name="pseudo-tape.tar"
next_volume_name=`echo -n "archive."; cat $dir/volno`
echo "moving $dir/$base_name to $dir/$next_volume_name"
mv "$dir/$base_name" "$dir/$next_volume_name"

ฉันไม่ได้ downvoted -M --tape-lengthคำตอบของคุณเพราะผมมีความสุขที่จะเห็นหนึ่งที่ใช้ อย่างไรก็ตามคำตอบนี้ไม่สนใจคำขอของ OP สำหรับโซลูชันที่ใช้การบีบอัด gzip หรือ bzip2
sampablokuper

ข้อควรระวัง: คุณไม่ได้พูดถึงtarแต่เกี่ยวกับ tar clone ที่เรียกว่าgtar(GNU tar) tar tar นี้สนับสนุนการสร้างไฟล์เก็บหลายวอลุ่ม แต่ด้วยความน่าจะเป็นที่สังเกตได้นั้นไม่สามารถ / ไม่เต็มใจที่จะดึงออกมาจากไฟล์เก็บถาวรแบบหลายวอลุ่มเนื่องจากมันอ้างอย่างไม่ถูกต้องว่าปริมาณการติดตามไม่ใช่ส่วนต่อเนื่องที่ถูกต้อง
Schily
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.