Чи є в 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.