Linux下二進位制檔案的分割與合併

2021-08-31 22:24:31 字數 4781 閱讀 6166

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...