Existe alguma ferramenta no Linux para dividir um arquivo?

16

Eu tenho um arquivo 500G que eu gostaria de dividir no linux, mas eu não tenho outro 500G livre para rodar split(1).

Existe uma ferramenta ou script que irá dividir o arquivo in-loco em pedaços de 1G enquanto usa o mínimo de espaço extra?

ngoozeff
fonte

Respostas:

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}"

O gedit correu com sucesso após desmontá-lo e montá-lo novamente.

whitequark
fonte
2
Observe que você pode usar 'dd if = / dev / null de = "$ {filename}" seek = 1 bs = $ (($ size - $ _size))' se por algum motivo você não tiver truncado
ngoozeff
1
Obrigado, o roteiro funciona muito bem! Se algo der errado, não queremos excluir o arquivo, a última linha deve ser: if [ $(stat -c '%s' "${filename}") == 0 ]; then rm "${filename}" fi
Oleg Mikheev
Também é necessário mencionar que este script requer espaço adicional, o que equivale ao tamanho da peça (se você estiver quebrando 500 GB em duas partes, precisará de 250 GB)
Oleg Mikheev
Vou acrescentar que quando passei o valor 10737418240, ou seja, 10 GB, criou erroneamente arquivos de 2 GB. Eu estava dividindo um arquivo de 300GB e tinha 30GB grátis.
Xavier Leprêtre
2

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}"
Dertalai
fonte
1

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.

Kevin Vermeer
fonte