Linux下分割 合併檔案 dd和cat

2021-05-26 23:42:59 字數 4620 閱讀 4354

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最大檔案大小切...