Yanıtlar:
#!/bin/bash
# (c) whitequark 2010
set -e
if [ $# != 2 ]; then
echo "Usage: $0 <filename> <part size>"
echo " This script will split file to multiple parts, starting from"
echo " the end, and truncating the original file in process."
echo " Part size is specified in bytes."
echo " Use at your own risk."
exit 0
fi
filename=$1
partsize=$2
size=$(stat -c '%s' "${filename}")
parts=$(($size / $partsize))
do_split() {
_part=$1
_size=$2
echo "Splitting part $_part"
echo $(($partsize * ($_part - 1)))
dd if="${filename}" of="${filename}.$(printf '%04d' $_part)" \
count=1 bs=$partsize skip=$(($_part - 1))
echo "Truncating source file"
truncate "${filename}" --size="-$_size"
}
lastsize=$(($size % $partsize))
if [ $lastsize != 0 ]; then
do_split $(($parts + 1)) $lastsize
fi
for i in $(seq $parts -1 1); do
do_split $i $partsize
done
rm "${filename}"
gedit, söküp tekrar monte ettikten sonra başarıyla koştu.
if [ $(stat -c '%s' "${filename}") == 0 ]; then rm "${filename}" fi
10737418240
, yani 10GB, yanlış 2GB dosyaları oluşturdu. 300GB'lık bir dosyayı bölüyordum ve 30GB'lık boş alanım vardı.
@Whitequark betiğini gerçekten yararlı buldum. Ama 500GB'lık bir disk görüntüsünü, her biri yaklaşık 50GB'lık büyük parçalara bölmek istedim. Bu şekilde, komut dosyası başarısız oldu, çünkü dd
böyle büyük bir bs
parametreyi işleyemiyor.
Bu yüzden betiği bs=1M
bayt yerine megabayt yapmak ve istemek için özelleştirdim . Şimdi, örneğin 50000
50 GB için kullanarak ve gerçekten büyük parçalar halinde bölünebilirim .
#! / Bin / bash # (c) whitequark 2010 # (c) Dertalai 2015 (minimum değişiklikler) set -e eğer [$ #! = 2]; sonra echo "Kullanım: $ 0" echo "Bu komut dosyası, dosyadan itibaren birden çok parçaya bölünecek" echo "son ve devam eden orijinal dosyayı kısaltmak." echo "Parça boyutu megabayt olarak belirtilir (1 MB = 1048576 bayt)." echo "Kendi sorumluluğunuzdadır kullanın." çıkış 0 fi filename = $ 1 # Partsize = $ 2 partsizeMB = $ 2 parça boyutu = $ ((2 $ * 1048576)) size = $ (stat -c '% s' "$ {dosyaadı}") parçalar = $ (($ size / $ partsize)) do_split () { _part = $ 1 _size = $ 2 echo "Parça bölme $ _part" echo $ (($ parça büyüklüğü * ($ _part - 1)))) dd if = "$ {dosyaadı} =" $ {dosyaadı} ". $ (printf '% 04d' $ _part)" \ sayı = $ partsizeMB bs = 1M atlama = $ ((($ _ part - 1) * $ partsizeMB)) echo "Kaynak dosya kesiliyor" "$ {dosyaadı}" --size = "- $ _ boyut" } son boyut = $ (($ size% $ partsize)) eğer [$ lastsize! = 0]; sonra do_split $ (($ parçalar + 1)) $ son boyut fi $ i için (seq $ parça -1 1); yapmak do_split $ i $ parça boyutu tamam rm "$ {dosyaadı}"
Aslında 500GB dosyanız var mı? Bir klasörü veya diski arşivleyerek 500 GB'lık bir dosya oluşturuyorsanız ve daha sonra bölmeye çalışıyorsanız, tar (veya ne kullanırsanız kullanın) çıktısını bölmeye ayırarak dosyayı anında bölebilirsiniz:
sudo tar cvjsp /Volumes/BackupDisk/Backups.backupdb/ | \
split -d -b 4480m - Backups.backupdb.tar.bz2.
Bu, Time makine veritabanımın arşivinin DVD boyutunda bölünmelerini sağlayacaktır. Ancak, hepsini bir kerede yapar, yani aradığınız şeyi gerçekten yapmaz.
Daha fazla bilgi için soruma buradan bakın . Whitequark'ın senaryosu orada küçük bir değişiklikle faydalı olabilir! Denemek zorundayım.