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
fiif [ -e $filename ];then
filesize=`du -b $filename | awk ''`
if [ $filesize == 0 ];then
echo "error:the file size is zero!"
exit
fiecho "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
fiecho $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=1skipnum=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: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
fiecho $subfilenum | grep '^[0-9]\+$' > /dev/null
if [ $? -ne 0 ];then
echo "error:input must be a number"
exit
fiif [ $subfilenum -eq 0 ];then
echo "error:the number of subfiles can not be zero"
exit
fi#合併檔案
i=1newfile=$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
fidone
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):
60file 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:
2file1 done!
file2 done!
subfiles be merged into file.bak
success!
[root]# ls
caf.sh ddf.sh file file1 file2 file.bak
DD命令分割,合併檔案
dd命令是linux下乙個非常有用的磁碟命令。它可以將指定大小的塊拷貝成乙個檔案,並在拷貝的同時執行指定的轉換。unix已經提供了檔案切割功能,能完成這個功能的unix命令就是dd。要切割的大檔案為dgjd,共98336321位元組,則 dd if dgjd of zz1 bs 1 count 20...
Linux下分割合併檔案
切割合併檔案在linux下用split和cat就可以完成。下面舉些例項進行說明。1.檔案切割 檔案切割模式分為兩種 文字檔案 二進位制模式。1.1文字模式 按最大檔案大小切割 按文字行數切割。1.1.1最大檔案大小切割 split c 5k duanxin split 將文字檔案duanxin按每塊...
Linux下分割合併檔案
切割合併檔案在linux下用split和cat就可以完成。下面舉些例項進行說明。1.檔案切割 檔案切割模式分為兩種 文字檔案 二進位制模式。1.1文字模式 文字模式只適用於文字檔案,用這種模式切割後的每個檔案都是可讀的。文字模式又分為兩種 按最大檔案大小切割 按文字行數切割。1.1.1最大檔案大小切...