Есть ли в linux инструменты для разбиения файла на месте?

16

У меня есть файл 500G, который я хотел бы разделить в Linux, но у меня нет еще 500G бесплатно для работы split(1).

Существует ли инструмент или сценарий, который разбивает файл на месте на куски 1G, используя при этом минимальное дополнительное пространство?

ngoozeff
источник

Ответы:

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 успешно запустился после разборки и повторной сборки.

whitequark
источник
2
обратите внимание, что вы можете использовать 'dd if = / dev / null of = "$ {filename}" seek = 1 bs = $ (($ size - $ _size)) ", если по какой-то причине у вас нет усечения
ngoozeff
1
Спасибо, скрипт отлично работает! Если что-то пойдет не так, мы не хотим удалять файл, последняя строка лучше будет:if [ $(stat -c '%s' "${filename}") == 0 ]; then rm "${filename}" fi
Олег Михеев
Также необходимо отметить, что этот сценарий требует дополнительного пространства, равного размеру детали (если вы разбиваете 500 ГБ на две части, вам потребуется 250 ГБ)
Олег Михеев
Я добавлю, что когда я передал значение 10737418240, то есть 10 ГБ, он ошибочно создал файлы 2 ГБ. Я разделял файл на 300 ГБ и имел 30 ГБ свободного.
Ксавье Лепретр,
3

Я нашел скрипт @whitequark действительно полезным. Но я хотел разделить образ диска на 500 ГБ на несколько больших кусков по 50 ГБ каждый. Таким образом, скрипт потерпел неудачу, так как ddне может обработать такой большой bsпараметр.

Поэтому я настроил скрипт для создания bs=1Mи запроса мегабайт вместо байтов. Теперь я могу разделить на места и на действительно большие куски, используя, например, 5000050 ГБ.

#! / Bin / Баш
# (c) whitequark 2010
# (c) dertalai 2015 (минимальные модификации)

установить -е

if [$ #! = 2]; тогда
  echo "Использование: $ 0"
  echo "Этот скрипт разделит файл на несколько частей, начиная с"
  echo "конец и усечение исходного файла в процессе."
  echo "Размер детали указан в мегабайтах (1 МБ = 1048576 байт)."
  echo "Используйте на свой страх и риск."
  выход 0
фи

имя файла = $ 1
# Partsize = $ 2
partsizeMB = $ 2
partsize = $ (($ 2 * 1048576))

size = $ (stat -c '% s' "$ {filename}")
части = $ (($ размер / $ части размера))

do_split () {
  _part = $ 1
  _size = $ 2

  эхо "Разделение части $ _part"
  echo $ (($ partsize * ($ _part - 1)))
  dd if = "$ {filename}" of = "$ {filename}. $ (printf '% 04d' $ _part)" \
      count = $ partsizeMB bs = 1M skip = $ ((($ _ part - 1) * $ partsizeMB))
  echo "Усечение исходного файла"
  усечь "$ {filename}" --size = "- $ _ size"
}

lastsize = $ (($ size% $ partsize))
if [$ lastsize! = 0]; тогда
  do_split $ (($ parts + 1)) $ lastsize
фи

для я в $ (seq $ частей -1 1); делать
  do_split $ i $ partsize
сделано

rm "$ {filename}"
Dertalai
источник
1

У вас действительно есть файл на 500 ГБ? Если вы генерируете файл объемом 500 ГБ, архивируя папку или диск, а затем пытаясь разделить его, вы можете разделить его на лету, передавая вывод tar (или что вы используете) в split:

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

Это сделает раскол размером в DVD из архива моей базы данных Time Machine. Тем не менее, он делает их все сразу, а это значит, что он действительно не делает то, что вы ищете.

Смотрите мой вопрос здесь для получения дополнительной информации. Сценарий Уайткварка может быть полезен с небольшой поправкой! Я должен попробовать это.

Кевин Вермеер
источник