用 dd 命令來分割一個 檔案然後再組回來 範例程式如下...
這個程式的使用方式就是
./split 原始檔案名稱 分割大小
如此 它會建一個目錄放在 $(pwd)/Partial 這個目錄下, 執行完後 會再將它組回來 放在同一層目錄當中, 檔名為
$INPUT_FILENAME-SAKBK-RESULTS.
dd 使用上要注意 的是 skip, 和 seek 的用法.兩個都是 skip 只是對象的不同而已
skip 是略過 if (input file) 所指定的檔案 的 bs * count 大小 然後才開始讀入
seek 是略過 of (output file) 所指定的檔案 的 bs * count 大小 然後才開始寫入
bs 大小 default 是 512 bytes, 切記 count 一要給 不然你整顆哈滴會被灌爆
/* ---- Example ----- */
#!/bin/bash
INPUT_FILENAME=$1
ORG_SIZE=$(ls -l $INPUT_FILENAME | awk '{print $5}')
FRAG_SIZE=$2
OFFSET=0
SPLIT=
DIR=$(pwd)/Partial
echo ${1:? The File you want to split is empty ...}
echo ${2:? The fragment size of $1 is empty ... }
[ -n $DIR ] && mkdir -p $DIR
rm -rf $DIR/*
TOTAL_PART=$(expr $ORG_SIZE / $FRAG_SIZE)
LEFT=$(expr $ORG_SIZE % $FRAG_SIZE)
echo "=> Waiting ..."
for((i=1; i<=$TOTAL_PART; i++)); do
[ ${#i} -eq 1 ] && SPLIT="0$i" || SPLIT="$i"
dd if=$INPUT_FILENAME of=$DIR/$INPUT_FILENAME-SAKBK-$SPLIT bs=1 count=$FRAG_SIZE skip=$OFFSET &>/dev/null
((OFFSET=OFFSET+FRAG_SIZE))
done
[ ${#i} -eq 1 ] && SPLIT="0$i" || SPLIT="$i"
dd if=$INPUT_FILENAME of=$DIR/$INPUT_FILENAME-SAKBK-$SPLIT bs=1 count=$LEFT skip=$OFFSET &>/dev/null
echo "=> Split Completed ..."
echo "=> The fragment of $INPUT_FILENAME is $i"
echo "=> Waiting for a while, when reassemble the file ..."
OFFSET=0
for((j=1; j<$i; j++)) ; do
[ ${#j} -eq 1 ] && SPLIT="0$j" || SPLIT="$j"
dd if=$DIR/$INPUT_FILENAME-SAKBK-$SPLIT of=$INPUT_FILENAME-SAKBK-RESULTS bs=1 count=$FRAG_SIZE seek=$OFFSET &>/dev/null
((OFFSET=OFFSET+FRAG_SIZE))
done
[ ${#j} -eq 1 ] && SPLIT="0$j" || SPLIT="$j"
dd if=$DIR/$INPUT_FILENAME-SAKBK-$SPLIT of=$INPUT_FILENAME-SAKBK-RESULTS bs=1 count=$LEFT seek=$OFFSET &>/dev/null
echo "===> The $INPUT_FILENAME-SAKBK-RESULTS completes!"