Bagaimana cara membuat arsip tar terpisah dalam beberapa tahap untuk menghemat ruang?

Jan 08 2021

Saya memiliki folder yang sangat besar yang saya coba buat arsip tarnya. Masalahnya adalah saya tidak memiliki cukup ruang kosong ekstra untuk menyimpan seluruh arsip, jadi saya ingin membuat potongan arsip 100-200GB pada satu waktu dan mentransfernya satu per satu ke penyimpanan cloud. Saya harus dapat mengontrol kapan potongan baru dibuat sehingga HDD saya tidak terisi, tetapi semua perintah yang saya temukan untuk membuat tarball terpisah selalu membuatnya sekaligus, di direktori yang sama.

Solusi terdekat yang saya temukan adalah dari pertanyaan ini tetapi semua tanggapan mendasarkan arsip pada jumlah file, bukan ukuran yang penting untuk kasus penggunaan saya karena ukuran file saya tidak terdistribusi secara merata.

Jawaban

2 EduardoTrápani Jan 08 2021 at 10:09

Anda dapat menggunakan tar, dengan opsi berikut:

--new-volume-script=COMMAND
--tape-length=N

Pada akhir setiap volume itu akan memanggil skrip Anda, yang akan memiliki beberapa variabel lingkungan untuk mengetahui volume mana yang baru saja diproses. Periksa halaman manual untuk daftar lengkapnya, tetapi setidaknya variabel TAR_VOLUME cukup berguna, jika Anda harus mengganti nama file output, atau tetap melacak volume saat ini:

TAR_VOLUME Nomor urut dari tar volume sedang diproses (disetel jika membaca arsip multi-volume).

Jika pengembalian skrip 0 tarakan dilanjutkan, jika tidak maka akan berhenti.

Misalnya, ini akan membuat setiap volume, dengan ukuran maksimum 20M, memanggil skrip Anda setiap kali batas tercapai:

tar cvf /tmp/volume.tar /path/to/files/ --new-volume-script=/path/to/myscript.sh --tape-length=20M

Skripnya bisa sederhana echo "Next volume";readatau Anda bahkan bisa melakukan transfer darinya (mengganti nama volume, karena begitu Anda keluar /tmp/volume.tarakan ditimpa).

Di sisi lain, pastikan untuk menggunakan flag --multi-volume. Jika tidak, tar akan berhenti dengan kesalahan (saya membiarkannya jika seseorang mencari kesalahan):

tar: EOF tak terduga dalam arsip

tar: Kesalahan tidak dapat dipulihkan: keluar sekarang

tar xvf /path/to/transferred.volume --multi-volume

Siapkan volume # 2 untuk /path/to/transferred.volume dan tekan kembali:

tarakan meminta Anda untuk volume baru. Begitu Anda tekan enter /path/to/transferred.volumeakan dibuka kembali, begitu seterusnya.

1 JoshHarrison Jan 09 2021 at 01:30

Menindaklanjuti jawaban luar biasa eduardo-trápani , di bawah ini adalah versi skrip yang sedikit dimodifikasi yang ditemukan di Halaman GNU yang menunggu masukan pengguna untuk setiap volume dan mencoba lagi jika volume tidak ditemukan:

Untuk kelengkapannya inilah perintah yang digunakan untuk membuat arsip:

tar cvf /tmp/volume.tar /path/to/files/ --new-volume-script=./myscript.sh --tape-length=1000M

Dan ini adalah perintah yang saya gunakan untuk mengekstrak arsip terpisah:

tar xvf /tmp/volume.tar --multi-volume --new-volume-script=./myscript.sh

myscript.sh:

#!/bin/bash
# For this script it's advisable to use a shell, such as Bash,
# that supports a TAR_FD value greater than 9.

echo "Press enter to continue to next volume"

read

echo Preparing volume $TAR_VOLUME of $TAR_ARCHIVE.

name=`expr $TAR_ARCHIVE : '\(.*\)-.*'` case $TAR_SUBCOMMAND in
-c)       ;;
-d|-x|-t) test -r ${name:-$TAR_ARCHIVE}-$TAR_VOLUME || echo "Failed to find volume" ;; *) exit 1 esac echo ${name:-$TAR_ARCHIVE}-$TAR_VOLUME >&$TAR_FD

Sunting: Ini hanya bekerja dengan GNU Tar yang dapat diinstal pada macOS (w / Homebrew) oleh:

brew install gnu-tar

Untuk menggunakannya sebagai tar default Anda, Anda perlu menambahkannya ke jalur Anda seperti:

export PATH="$(brew --prefix)/opt/python/libexec/bin:$PATH"