用 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!"


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 sakbk 的頭像
    sakbk

    sakbk

    sakbk 發表在 痞客邦 留言(1) 人氣()