Yer kazanmak için birden çok aşamada bölünmüş katran arşivi nasıl oluşturulur?
Tar arşivi oluşturmaya çalıştığım çok büyük bir klasörüm var. Sorun şu ki, tüm arşivi depolamak için yeterli boş alanım yok, bu yüzden bir seferde örneğin 100-200 GB arşiv parçalarını oluşturmak ve bunları ayrı ayrı bulut depolamaya aktarmak istiyorum. Yeni yığınların ne zaman oluşturulacağını kontrol edebilmem gerekiyor, böylece HDD'm dolmaz, ancak bölünmüş tarball'ları oluşturmak için bulduğum tüm komutlar her zaman hepsini aynı dizinde aynı anda oluşturur.
Bulduğum en yakın çözüm bu soruydu, ancak tüm yanıtlar arşivleri dosya sayısına dayandırıyor, dosya boyutlarım eşit olmayan bir şekilde dağıtıldığı için kullanım durumum için önemli olan boyuta değil.
Yanıtlar
Şu tar
seçeneklerle kullanıcı yapabilirsiniz :
--new-volume-script=COMMAND
--tape-length=N
Her cildin sonunda, hangi birimin henüz işlendiğini bilmek için bazı ortam değişkenlerine sahip olan komut dosyanızı arayacaktır. Kontrol kılavuz sayfasını çıkış dosyayı yeniden adlandırmak veya geçerli hacminin izlemek nasılsa tutmak zorunda tam listesi için, ama en azından değişken TAR_VOLUME durumda oldukça yararlıdır:
TAR_VOLUME İşlenen hacim katranının sıra numarası (çok ciltli bir arşiv okuyorsanız ayarlayın).
Komut dosyası dönmeye 0
tar
devam edecekse , aksi takdirde duracaktır.
Örneğin, bu, maksimum 20M boyutunda her bir birimi oluşturur ve sınıra her ulaşıldığında komut dosyanızı çağırır:
tar cvf /tmp/volume.tar /path/to/files/ --new-volume-script=/path/to/myscript.sh --tape-length=20M
Komut dosyası basit echo "Next volume";read
olabilir veya hatta aktarımı ondan bile yapabilirsiniz (birimi yeniden adlandırın, çünkü çıktığınızda /tmp/volume.tar
üzerine yazılır).
Diğer tarafta, --multi-volume bayrağını kullandığınızdan emin olun. Bunu yapmazsanız, tar hatalarla durur (birisinin hatayı araması durumunda bırakırım):
tar: Arşivde beklenmeyen EOF
tar: Hata düzeltilemez: şimdi çıkılıyor
tar xvf /path/to/transferred.volume --multi-volume
/Path/to/transferred.volume için 2 numaralı birimi hazırlayın ve return tuşuna basın:
tar
yeni birim için sizden bilgi isteyecektir. Enter tuşuna bastığınızda /path/to/transferred.volume
tekrar açılır ve bu böyle devam eder.
Eduardo-trápani'nin mükemmel cevabının ardından , aşağıda, GNU Sayfasında bulunan ve her cilt için kullanıcı girdisini bekleyen ve bir cilt bulunamazsa yeniden deneyen bir betiğin biraz değiştirilmiş bir sürümü var :
Tamlık için arşivi oluşturmak için kullanılan komut budur:
tar cvf /tmp/volume.tar /path/to/files/ --new-volume-script=./myscript.sh --tape-length=1000M
Ve bu, bölünmüş arşivi çıkarmak için kullandığım komut:
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
Düzenleme: Bu, yalnızca macOS (w / Homebrew) üzerine kurulabilen GNU Tar ile çalışır:
brew install gnu-tar
Bunu varsayılan katranınız olarak kullanmak için yolunuza şu şekilde eklemeniz gerekir:
export PATH="$(brew --prefix)/opt/python/libexec/bin:$PATH"