Bagaimana cara membuat arsip tar terpisah dalam beberapa tahap untuk menghemat ruang?
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
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
tar
akan 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";read
atau Anda bahkan bisa melakukan transfer darinya (mengganti nama volume, karena begitu Anda keluar /tmp/volume.tar
akan 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:
tar
akan meminta Anda untuk volume baru. Begitu Anda tekan enter /path/to/transferred.volume
akan dibuka kembali, begitu seterusnya.
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"