Respostas:
#!/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}"
O gedit correu com sucesso após desmontá-lo e montá-lo novamente.
if [ $(stat -c '%s' "${filename}") == 0 ]; then rm "${filename}" fi
10737418240, ou seja, 10 GB, criou erroneamente arquivos de 2 GB. Eu estava dividindo um arquivo de 300GB e tinha 30GB grátis.
Eu achei o script @whitequark realmente útil. Mas eu queria dividir uma imagem de disco de 500GB em alguns grandes pedaços de cerca de 50GB cada. Desta forma, o script falhou, uma vez que dd não consegue lidar com tamanho bs parâmetro.
Então eu customizei o script para fazer bs=1M e pedindo megabytes em vez de bytes. Agora eu posso dividir no lugar e em pedaços muito grandes usando, por exemplo, 50000 por 50 GB.
#!/bin/bash
# (c) whitequark 2010
# (c) dertalai 2015 (minimal modifications)
set -e
if [ $# != 2 ]; then
echo "Usage: $0 "
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 megabytes (1 MB = 1048576 bytes)."
echo " Use at your own risk."
exit 0
fi
filename=$1
#partsize=$2
partsizeMB=$2
partsize=$(($2 * 1048576))
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=$partsizeMB bs=1M skip=$((($_part - 1) * $partsizeMB))
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}"
Você realmente tem o arquivo de 500GB ainda? Se você estiver gerando um arquivo de 500 GB ao arquivar uma pasta ou um disco e depois tentar dividi-lo, poderá dividi-lo rapidamente ao dividir a saída do tar (ou o que estiver usando) em divisão:
sudo tar cvjsp /Volumes/BackupDisk/Backups.backupdb/ | \
split -d -b 4480m - Backups.backupdb.tar.bz2.
Isso fará com que as divisões em tamanho de DVD de um arquivo do meu banco de dados da máquina do tempo. No entanto, faz todos de uma vez, o que significa que realmente não faz o que você está procurando.
Veja minha pergunta Aqui para mais informações. O roteiro de Whitequark pode ser útil com algumas pequenas modificações! Eu vou ter que tentar.