Ответы:
#!/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
и запроса мегабайт вместо байтов. Теперь я могу разделить на места и на действительно большие куски, используя, например, 50000
50 ГБ.
#! / 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. Тем не менее, он делает их все сразу, а это значит, что он действительно не делает то, что вы ищете.
Смотрите мой вопрос здесь для получения дополнительной информации. Сценарий Уайткварка может быть полезен с небольшой поправкой! Я должен попробовать это.