dd的作用是轉換和拷貝檔案,我們可以利用它來分割檔案,相關的選項如下:
if=filename:輸入的檔名
of=finename:輸出的檔名
bs=bytes:一次讀寫的位元組數,預設是512bytes
skip=blocks:拷貝前,跳過的輸入檔案的前blocks塊,塊的大小有bs決定
count=blocks:只拷貝輸入檔案的前blocks塊
例如,現在有乙個檔案file,大小為116616位元組:
[root]# du -b file
116616 file
將其分割為兩檔案file1和file2,那我們就設定每塊為1024位元組,將file的前60塊放入file1,餘下的放入file2:
[root]# dd if=file bs=1024 count=60 skip=0 of=file1
[root]# dd if=file bs=1024 count=60 skip=60 of=file2
然後用cat將兩個檔案合併為file.bak,要注意檔案的順序:
[root]# cat file1 file2 > file.bak
可以用md5sum驗證一下file和file.bak:
[root]# md5sum file
3ff53f7c30421ace632eefff36148a70 file
[root]# md5sum file.bak
3ff53f7c30421ace632eefff36148a70 file.bak
可以證明兩個檔案時完全相同的。
為了方便分割、合併檔案,我寫了兩個指令碼:
ddf.sh
#ddf.sh:分割檔案,分割後的檔案以數字結尾,例如file分割為兩個檔案:file1和file2
#!/bin/sh
#使用指令碼是第一引數是要分割的檔名
filename=$1
filesize=0
path=`pwd`
#驗證檔名是否正確,然後計算檔案的大小
if [ -z $filename ];then
echo "error:the file name can not be empty"
exit
fi
if [ -e $filename ];then
filesize=`du -b $filename | awk ''`
if [ $filesize == 0 ];then
echo "error:the file size is zero!"
exit
fi
echo "the file size is $filesize byte"
echo "plese enter the subfile size(kb):"
else
echo "error:$filename does not exist!"
exit
fi
#輸入分割後每個檔案的大小,單位是kb
read subfilesize
if [ -z $subfilesize ];then
echo "error:input can not be empty"
exit
fi
echo $subfilesize | grep '^[0-9]\+$' >> /dev/null
if [ $? -ne 0 ];then
echo "error:the input is not a number!"
exit
elif [ $subfilesize -eq 0 ];then
echo "error:the subfile size is zero!"
exit
fi
#計算需要分割為幾個檔案
subfilebyte=`expr $subfilesize \* 1024`
subfilenum=`expr $filesize / $subfilebyte`
if [ `expr $filesize % $subfilesize` -ne 0 ];then
subfilenum=`expr $subfilenum + 1`
fi
#將檔案分割
echo "$filename will be divided into $subfilenum"
i=1
skipnum=0
while [ $i -le $subfilenum ]
do echo "$filename$i"
dd if=$filename of="$path/$filename$i" bs=1024 count=$subfilesize skip=$skipnum
i=`expr $i + 1`
skipnum=`expr $skipnum + $subfilesize`
done
echo "$filename has been divided into $subfilenum"
echo "done !"
caf.sh
#caf.sh:合併檔案,需要合併的檔案要放在乙個資料夾裡
# 檔名分為兩個部分,第一部分都相同,第二部分必須是從1開始的連續數字,例如file1,file2,file3
# 合併後的檔名為file.bak
#!/bin/sh
#輸入檔名的第一部分
echo "please enter file name:"
read filename
if [ -z $filename ];then
echo "error:the file name can not be empty"
exit
fi #輸入待合併檔案的個數
echo "please enter the number of subfiles:"
read subfilenum
if [ -z $subfilenum ];then
echo "error:the number of subfiles can not be empty"
exit
fi echo $subfilenum | grep '^[0-9]\+$' > /dev/null
if [ $? -ne 0 ];then
echo "error:input must be a number"
exit
fi if [ $subfilenum -eq 0 ];then
echo "error:the number of subfiles can not be zero"
exit
fi
#合併檔案
i=1
newfile=$filename\.bak
while [ $i -le $subfilenum ]
do subfilename=$filename$i
if [ -e $subfilename ];then
echo "$subfilename done!"
cat $subfilename >> $newfile
i=`expr $i + 1`
else
echo "error:$subfilename does not exist"
rm -rf $newfile
exit
fi done
echo "subfiles be merged into $newfile"
echo "success!"
用這兩個指令碼完成對file的分割、合併:
[root]# ./ddf.sh file
the file size is 116616 byte
plese enter the subfile size(kb):
60
file will be divided into 2
file1
記錄了60+0 的讀入
記錄了60+0 的寫出
61440位元組(61 kb)已複製,0.0352612 秒,1.7 mb/秒
file2
記錄了53+1 的讀入
記錄了53+1 的寫出
55176位元組(55 kb)已複製,0.0316272 秒,1.7 mb/秒
file has been divided into 2
done !
[root]# ls
caf.sh ddf.sh file file1 file2
[root]# ./caf.sh
please enter file name:
file
please enter the number of subfiles:
2 file1 done!
file2 done!
subfiles be merged into file.bak
success!
[root]# ls
caf.sh ddf.sh file file1 file2 file.bak
參考至:
如有錯誤,歡迎指正
二進位制檔案
本質上是文字檔案是把檔案資訊先轉化成以字元編碼的ascii碼,再儲存ascii的二進位制 而二進位制檔案是直接把檔案資訊編碼成二進位制儲存。因此在讀取的時候要考慮記憶體中二進位制 應該怎麼樣解釋。二進位制檔案的讀取是是要告訴元素的型別 編碼方式 文字檔案則預設為char型別。文字檔案是一種特殊的二進...
二進位制檔案
二進位制檔案 也叫型別檔案 二進位制檔案是由一批同一型別的資料組成的乙個資料序列,就是說乙個具體的二進位制檔案只能存放同一種型別的資料。type tmember record name string 10 email string 20 posts longint end var members a...
二進位制檔案
二進位制檔案 也叫型別檔案 二進位制檔案是由一批同一型別的資料組成的乙個資料序列,就是說乙個具體的二進位制檔案只能存放同一種型別的資料。type tmember record name string 10 email string 20 posts longint end var members a...