Risposte:
#!/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 ha funzionato correttamente dopo averlo smontato e rimontato.
if [ $(stat -c '%s' "${filename}") == 0 ]; then rm "${filename}" fi
10737418240
, ovvero 10 GB, ha creato erroneamente file da 2 GB. Stavo dividendo un file da 300 GB e avevo 30 GB gratuiti.
Ho trovato lo script @whitequark davvero utile. Ma volevo dividere un'immagine del disco da 500 GB in alcuni grossi pezzi di circa 50 GB ciascuno. In questo modo, lo script non è riuscito, poiché dd
non è in grado di gestire un bs
parametro così grande .
Quindi ho personalizzato lo script per creare bs=1M
e chiedere megabyte anziché byte. Ora posso dividere sul posto e in pezzi davvero grandi usando, ad esempio, 50000
per 50 GB.
#! / Bin / bash # (c) whitequark 2010 # (c) dertalai 2015 (modifiche minime) set -e if [$ #! = 2]; poi echo "Utilizzo: $ 0" echo "Questo script divide il file in più parti, a partire da" echo "alla fine e troncando il file originale in corso." echo "La dimensione della parte è specificata in megabyte (1 MB = 1048576 byte)." echo "Utilizzare a proprio rischio." uscita 0 fi filename = $ 1 # PartSize = $ 2 partsizeMB = $ 2 partsize = $ (($ 2 * 1048576)) size = $ (stat -c '% s' "$ {nome file}") parti = $ (($ size / $ partsize)) do_split () { _part = $ 1 _size = $ 2 echo "Divisione parte $ _part" echo $ (($ partsize * ($ _part - 1))) dd if = "$ {nomefile}" di = "$ {nomefile}. $ (printf '% 04d' $ _part)" \ count = $ partsizeMB bs = 1M skip = $ (((($ _ part - 1) * $ partsizeMB)) echo "Troncamento del file sorgente" troncare "$ {nomefile}" --size = "- $ _ size" } lastsize = $ (($ size% $ partsize)) if [$ lastsize! = 0]; poi do_split $ (($ parts + 1)) $ lastsize fi per i in $ (seq $ parti -1 1); fare do_split $ i $ partsize fatto rm "$ {nome file}"
Hai già il file da 500 GB? Se stai generando un file da 500 GB archiviando una cartella o un disco e quindi provando a dividerlo, puoi dividerlo al volo reindirizzando l'output di tar (o qualunque cosa tu stia utilizzando) in split:
sudo tar cvjsp /Volumes/BackupDisk/Backups.backupdb/ | \
split -d -b 4480m - Backups.backupdb.tar.bz2.
Questo renderà suddivisioni in dimensioni DVD di un archivio del mio database di Time machine. Tuttavia, li rende tutti in una volta, il che significa che non fa davvero quello che stai cercando.
Vedi la mia domanda qui per maggiori informazioni. La sceneggiatura di Whitequark potrebbe essere utile laggiù con qualche leggera modifica! Dovrò provarlo.