Linux'ta bir dosyayı bölmek için herhangi bir araç var mı?


16

Linux'ta ayırmak istediğim 500G'lık bir dosyam var, ancak çalıştırmak için başka bir 500G'im yok split(1).

Minimum ekstra alan kullanırken dosyayı yerinde 1G parçalarına ayıracak bir araç veya komut dosyası var mı?

Yanıtlar:


13
#!/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.


2
not kendinizin kullanabileceği 'dd if = arasında = / dev / null "$ {dosyaadı}" aramaya = 1 bs = $ (($ boyutu - $ _size))' nedense sen kesiğinin yoksa
ngoozeff

1
Teşekkürler, komut dosyası harika çalışıyor! Bir şeyler ters giderse dosyayı silmek istemiyoruz, son satır daha iyi olur:if [ $(stat -c '%s' "${filename}") == 0 ]; then rm "${filename}" fi
Oleg Mikheev

Ayrıca, bu komut dosyasının parça boyutuna eşit ek alan gerektirdiğinden bahsetmek gerekir (500GB'ı iki parçaya
bölüyorsanız 250GB'a

Ekleyeceğim, değeri geçtiğimde 10737418240, yani 10GB, yanlış 2GB dosyaları oluşturdu. 300GB'lık bir dosyayı bölüyordum ve 30GB'lık boş alanım vardı.
Xavier Leprêtre

3

@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ü ddböyle büyük bir bsparametreyi işleyemiyor.

Bu yüzden betiği bs=1Mbayt yerine megabayt yapmak ve istemek için özelleştirdim . Şimdi, örneğin 5000050 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ı}"

1

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.