Here’s a small shell script based on dd’s output which helps to partition a flat file, split it up into its respective partitions so they can be formatted and put them all back together again.
#!/bin/bash
if [ "${1}" == "c" ]
then
if [ "${3}" == "" ]
then
echo "Usage: $0 $1 <filename> <filesize>"
exit 1
fi
echo "Creating new file [${2}]..."
dd if=/dev/zero of=${2} bs=${3}G count=1 > /dev/null 2>&1
echo "Partition the new flat file ( fdisk ${2} )"
echo
fi
if [ "${1}" == "s" ]
then
if [ "${2}" == "" ]
then
echo "Usage: $0 $1 <filename>"
exit 1
fi
unit=`fdisk -l "${2}" | grep -i '^Units' | sed -e 's/^.* \([0-9][0-9]*\) bytes.*$/\1/g'`
lase="-1"
numb=0
fdisk -l "${2}" | sed -e 's/^[ \t]*//g' -e 's/\*//g' | grep -i "^${2}[0-9][0-9]*" | while read line
do
curb=`echo "${line}" | awk '{ print $2 }'`
cure=`echo "${line}" | awk '{ print $3 }'`
let size="${cure} - ${curb} + 1"
let diff="${curb} - ${lase} - 1"
if [ ${diff} -gt 0 ]
then
let endi="${curb} - 1"
let skip="${lase} + 1"
echo "[${numb}] Unused space [${skip} - ${endi}] [${diff} blocks]..."
dd if=${2} bs=${unit} skip=${skip} count=${diff} of=${2}${numb} > /dev/null 2>&1
let numb="${numb} + 1"
fi
echo "[${numb}] Carving partition [${curb} - ${cure}] [${size} blocks]..."
dd if=${2} bs=${unit} skip=${curb} count=${size} of=${2}${numb} > /dev/null 2>&1
let numb="${numb} + 1"
lase="${cure}"
done
fdisk -l "${2}" | sed -e 's/^[ \t]*//g' -e 's/\*//g' | grep -i "^${2}[0-9][0-9]*" | tail -n 1 | while read line
do
endi=`echo "${line}" | awk '{ print $3 }'`
let rest="${endi} + 1"
numb="9"
echo "[${numb}] Copying ending [${rest} - <end>]..."
dd if=${2} bs=${unit} skip=${rest} of=${2}${numb} > /dev/null 2>&1
done
echo
echo "Create any filesystem needed ( mkfs.* ${2}[0-9] )"
echo "Mount any filesystem needed ( mount -o loop ${2}[0-9] /mnt/tmp[0-9] )"
echo "Copy any files needed ( cp -r source/* /mnt/tmp[0-9]/ )"
echo "Unmount any filesystem needed ( umount /mnt/tmp[0-9] )"
echo
fi
if [ "${1}" == "j" ]
then
if [ "${2}" == "" ]
then
echo "Usage: $0 $1 <filename>"
exit 1
fi
echo "Writing to file [${2}.join]..."
cat ${2}[0-9]* > ${2}.join
echo
fi