Ответы:
#!/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 ГБ.
#! / 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}"
У вас действительно есть файл на 500 ГБ? Если вы генерируете файл объемом 500 ГБ, архивируя папку или диск, а затем пытаясь разделить его, вы можете разделить его на лету, передавая вывод tar (или что вы используете) в split:
sudo tar cvjsp /Volumes/BackupDisk/Backups.backupdb/ | \
split -d -b 4480m - Backups.backupdb.tar.bz2.
Это сделает раскол размером в DVD из архива моей базы данных Time Machine. Тем не менее, он делает их все сразу, а это значит, что он действительно не делает то, что вы ищете.
Смотрите мой вопрос здесь для получения дополнительной информации. Сценарий Уайткварка может быть полезен с небольшой поправкой! Я должен попробовать это.