Відповіді:
#!/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 успішно пробіг після того, як його знову розбирають і збирають.
if [ $(stat -c '%s' "${filename}") == 0 ]; then rm "${filename}" fi
10737418240, тобто 10 ГБ, він неправильно створив 2 ГБ файлів. Я розділяв файл на 300 ГБ і мав 30 ГБ безкоштовно.
Я знайшов сценарій @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 "$ {ім'я файлу}"
У вас насправді є файл 500 ГБ? Якщо ви генеруєте файл 500 ГБ, архівуючи папку чи диск, а потім намагаєтесь розділити його, ви можете розділити його на ходу, проклавши висновок tar (або все, що ви використовуєте), на split:
sudo tar cvjsp /Volumes/BackupDisk/Backups.backupdb/ | \
split -d -b 4480m - Backups.backupdb.tar.bz2.
Це зробить розбиття DVD розміру архіву моєї бази даних Time Machine. Однак це робить їх все відразу, а це означає, що він справді не робить те, що ви шукаєте.
Дивіться моє запитання тут для отримання додаткової інформації. Сценарій Whitequark може бути корисним там з невеликою модифікацією! Мені доведеться спробувати.