Чи є в Linux інструменти для розділення файлу на місці?


16

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

Чи є інструмент або сценарій, який розділить файл на місці на шматки 1G, використовуючи при цьому мінімальний додатковий простір?

Відповіді:


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


2
зауважте, що ви можете використовувати "dd, якщо = / dev / null of =" $ {filename} "шукайте = 1 bs = $ (($ size - $ _size))", якщо з якихось причин у вас немає усікання
— ngoozeff

1
Дякую, сценарій чудово працює! Якщо щось піде не так, ми не хочемо видаляти файл, останній рядок краще бути:if [ $(stat -c '%s' "${filename}") == 0 ]; then rm "${filename}" fi
— Олег Міхеєв

Також слід зазначити, що для цього сценарію потрібен додатковий простір, який дорівнює розміру частини (якщо ви розбиєте 500 ГБ на дві частини, вам знадобиться 250 ГБ)
— Олег Міхеєв

Додам, що коли я передав значення 10737418240, тобто 10 ГБ, він неправильно створив 2 ГБ файлів. Я розділяв файл на 300 ГБ і мав 30 ГБ безкоштовно.
— Xavier Leprêtre

3

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

Тому я налаштував сценарій для створення bs=1Mта прохання мегабайт замість байтів. Тепер я можу розділитись на місці і по-справжньому великі шматки, використовуючи, наприклад, 5000050 Гб.

#! / бін / баш
# (c) Whitequark 2010
# (c) дерталай 2015 (мінімальні зміни)

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

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

ім'я файлу = $ 1
# розділ = 2 $
partizeMB = $ 2
розмір деталей = $ (($ 2 * 1048576))

size = $ (stat -c '% s' "$ {ім'я файлу}")
частин = $ ((розмір $ / розмір $)

do_split () {
  _part = $ 1
  _размер = $ 2

  echo "Розщеплення частини $ _part"
  echo $ (($ partize * ($ _part - 1)))
  dd if = "$ {filename}" of = "$ {filename}. $ (printf '% 04d' $ _part)" \
      count = $ partsizeMB bs = 1M пропуск = $ ((($ _ частина - 1) * $ partsizeMB))
  echo "Обрізання вихідного файлу"
  урізати "$ {ім'я файлу}" --size = "- $ _ розмір"
}

lastize = $ (($ size% $ partize))
якщо [$ триває! = 0]; потім
  do_split $ (($ частини + 1)) $ триває
фі

для i в $ (seq $ частини -1 1); робити
  do_split $ i $ розділ
зроблено

rm "$ {ім'я файлу}"

1

У вас насправді є файл 500 ГБ? Якщо ви генеруєте файл 500 ГБ, архівуючи папку чи диск, а потім намагаєтесь розділити його, ви можете розділити його на ходу, проклавши висновок tar (або все, що ви використовуєте), на split:

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

Це зробить розбиття DVD розміру архіву моєї бази даних Time Machine. Однак це робить їх все відразу, а це означає, що він справді не робить те, що ви шукаєте.

Дивіться моє запитання тут для отримання додаткової інформації. Сценарій Whitequark може бути корисним там з невеликою модифікацією! Мені доведеться спробувати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.