Buat pemisahan arsip tar menjadi blok dengan ukuran maksimum

83

Saya perlu membuat cadangan direktori yang cukup besar, tetapi saya dibatasi oleh ukuran file individual. Saya ingin dasarnya membuat tar.(gz|bz2)arsip yang dibagi menjadi arsip maksimum 200MB. Clonezilla melakukan sesuatu yang mirip dengan ini dengan memecah cadangan gambar dengan nama seperti:

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

Apakah ada cara saya bisa melakukan ini dalam satu perintah? Saya mengerti cara menggunakan splitperintah, tetapi saya ingin tidak harus membuat satu arsip raksasa, kemudian membaginya menjadi arsip yang lebih kecil, karena ini akan menggandakan ruang disk yang saya perlukan untuk awalnya membuat arsip.

Naftuli Kay
sumber
Sebuah pertanyaan terkait: superuser.com/q/290986/11574
sampablokuper

Jawaban:

108

Anda bisa mem-pipe tar ke perintah split:

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

Pada beberapa sistem * nix (seperti OS X) Anda mungkin mendapatkan kesalahan berikut:

split: illegal option -- -

Dalam hal ini coba ini (perhatikan -b 200m):

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

Jika Anda mencoba membagi file agar sesuai dengan drive yang diformat FAT32, gunakan batas byte 4294967295. Misalnya:

tar cvzf - /Applications/Install\ macOS\ Sierra.app/ | \
split -b 4294967295 - /Volumes/UNTITLED/install_macos_sierra.tgz.
jordanm
sumber
3
Bagus! Bagaimana cara mengekstrak arsip?
Naftuli Kay
24
Akan cat sda1.backup.tar.gz.* | tar xzvf -melakukan pekerjaan itu?
Naftuli Kay
3
Ya, seharusnya begitu. splitsecara default menetapkan nama file sehingga ketika diurutkan berdasarkan LOCALE (yang dilakukan dengan shell globbing) akan berada dalam urutan yang benar.
jordanm
4
Tanpa kata kerja, lakukan saja tar czf ...tanpa vdan gabungkan dengan cat backup.tar.gz.* | tar tar xzf - tanpa v. Saya tidak melihat manfaat dari keluaran verbose di sini v.
Léo Léopold Hertz 준영
1
Hanya membantu seorang teman dengan mengemas Xcode ke flash drive yang telah diformat FAT32 dengan: tar cvzf - Xcode.app/ | split -b 2000m - /Volumes/PH/xcode/xcode.tgz(digunakan dari cd /Applications/) Terima kasih banyak :)
ecth
13

Di macOS, splitperintahnya bekerja sedikit berbeda:

$ tar cvzf - foo | split -b 2500m - foo.tgz.
Erik Allik
sumber
4

Sekadar menambahkan: Karena ukuran file maksimum yang diizinkan dalam vfat / fat32 adalah 2 ^ 32 minus 1 (4294967295 bytes), perintah split dengan ukuran file maksimum yang diizinkan pada sistem file tersebut adalah:

split -b4294967295 -d my_input_file my_output_file_splitted
Aydin K.
sumber
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

Anda akan memerlukan skrip untuk otomatisasi memindahkan file pseudo-tape.tar ke nama baru:

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"
Sergey Romanovsky
sumber
Saya belum menurunkan jawaban Anda, karena saya senang melihat yang digunakan -M --tape-length. Namun, jawaban ini mengabaikan permintaan OP untuk solusi yang menggunakan kompresi gzip atau bzip2.
sampablokuper
Perhatian: Anda tidak berbicara tentang tartetapi lebih tentang klon tar yang disebut gtar(GNU tar). Klon tar ini mendukung untuk membuat arsip multi volume tetapi dengan probabilitas nyata tidak dapat / tidak mau mengekstraksi dari arsip multi volume tersebut karena mengklaim bahwa volume tindak lanjut bukan bagian kelanjutan yang tepat.
schily