Existe alguma ferramenta no Linux para dividir um arquivo?

16

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

Existe uma ferramenta ou script que irá dividir o arquivo no local em pedaços de 1G usando espaço extra mínimo?

    
por ngoozeff 19.08.2010 / 11:55

3 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.

    
por 19.08.2010 / 13:20
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. Dessa forma, o script falhou, pois dd não pode manipular um parâmetro bs tão grande.

Por isso, personalizei o script para criar bs=1M e pedir megabytes em vez de bytes. Agora eu posso dividir no lugar e em grandes pedaços usando, por exemplo, 50000 para 50GB.

#!/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}"
    
por 05.11.2015 / 09:19
1

Você realmente tem o arquivo de 500GB? Se você estiver gerando um arquivo de 500 GB ao arquivar uma pasta ou um disco e, em seguida, tentar dividi-lo, poderá dividi-lo ao dividir a saída de tar (ou o que estiver usando) em divisão:

sudo tar cvjsp /Volumes/BackupDisk/Backups.backupdb/ | \
     split -d -b 4480m - Backups.backupdb.tar.bz2.

Isto fará divisões em tamanho de DVD de um arquivo do meu banco de dados da máquina do tempo. No entanto, isso os torna 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 poderia ser útil com algumas pequenas modificações! Eu vou ter que tentar.

    
por 19.08.2010 / 13:36