在Linux最常用的文件生成和切片工具是dd,它功能比較全面,但無法以行為單位提取文件數(shù)據(jù),也無法直接將文件按大小或行數(shù)進(jìn)行均分(除非借助循環(huán))。另兩款數(shù)據(jù)分割工具split和csplit能夠比較輕松地實(shí)現(xiàn)這些需求。csplit是split的升級版。
創(chuàng)新互聯(lián)2013年至今,先為大邑縣等服務(wù)建站,大邑縣等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為大邑縣企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
1.1 dd命令
從if指定的文件讀取數(shù)據(jù),寫入到of指定的文件。使用bs指定讀取和寫入的塊大小,使用count指定讀取和寫入的數(shù)據(jù)塊數(shù)量,bs和count相乘就是文件總大小。可以指定skip忽略讀取if指定文件的前多少個(gè)塊,seek指定寫入到of指定文件時(shí)忽略前多少個(gè)塊。
dd if=/dev/zero of=/tmp/abc.1 bs=1M count=20
if是input file,of是output file;bs有c(1byte)、w(2bytes)、b(512bytes)、kB(1000bytes)、K(1024bytes)、MB(1000)、M(1024)和GB、G等幾種單位。因此,不要隨意在單位后加上字母B。
假設(shè)現(xiàn)有文件CentOS.iso的大小1.3G,需要將其切分后還原,切分的第一個(gè)小文件大小為500M。
dd if=/tmp/CentOS.iso of=/tmp/CentOS1.iso bs=2M count=250
生成第二個(gè)小文件,由于第二個(gè)小文件不知道具體大小,所以不指定count選項(xiàng)。由于第二個(gè)小文件要從第500M處開始切分,于是需要忽略CentOS.iso的前500M。假設(shè)bs=2M,于是skip掉的數(shù)據(jù)塊數(shù)量為250。
dd if=/tmp/CentOS.iso of=/tmp/CentOS2.iso bs=2M skip=250
現(xiàn)在CentOS.iso=CentOS1.iso+CentOS2.iso??梢詫entOS[1-2].iso還原。
cat CentOS1.iso CentOS2.iso CentOS_m.iso
比較CentOS_m.iso和CentOS.iso的md5值,它們是完全一樣的。
shell md5sum CentOS_m.iso CentOS.iso
504dbef14aed9b5990461f85d9fdc667 CentOS_m.iso
504dbef14aed9b5990461f85d9fdc667 CentOS.iso
那么seek選項(xiàng)呢?和skip有什么區(qū)別?skip選項(xiàng)是忽略讀取時(shí)的前N個(gè)數(shù)據(jù)塊,而seek是忽略寫入文件的前N個(gè)數(shù)據(jù)塊。假如要寫入的文件為a.log,則seek=2時(shí),將從a.log的第3個(gè)數(shù)據(jù)塊開始追加數(shù)據(jù),如果a.log文件本身大小就不足2個(gè)數(shù)據(jù)塊,則缺少的部分自動使用/dev/zero填充。
于是,在有了CentOS1.iso的基礎(chǔ)上,要將其還原為和CentOS.iso相同的文件,可以使用下面的方法:
dd if=/tmp/CentOS.iso of=/tmp/CentOS1.iso bs=2M skip=250 seek=250
還原后,它們的md5值也是相同的。
shellmd5sum CentOS1.iso CentOS.iso
504dbef14aed9b5990461f85d9fdc667 CentOS1.iso
504dbef14aed9b5990461f85d9fdc667 CentOS.iso
1.2 split命令
split工具的功能是將文件切分為多個(gè)小文件。既然要生成多個(gè)小文件,必然要指定切分文件的單位,支持按行切分以及按文件大小切分,另外還需解決小文件命名的問題。例如,文件名前綴、后綴。如果未明確指定前綴,則默認(rèn)的前綴為"x"。
以下是命令的語法說明:
例如,將/etc/fstab按行切分,每5行切分一次,并指定小文件的前綴為"fs_",后綴為數(shù)值后綴,且后綴長度為2。
[root@linuxidc ~]# split -l 5 -d -a 2 /etc/fstab fs_
[root@linuxidc~]# lsfs_00 fs_01 fs_02
查看任一小文件。
[root@linuxidc ~]# catfs_01
# Accessible filesystems, by reference, are maintained under'/dev/disk'# Seeman pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info#
UUID=b2a70faf-aea4-4d8e-8be8-c7109ac9c8b8 / xfs defaults 0 0UUID=367d6a77-033b-4037-bbcb-416705ead095 /boot xfs defaults 0 0
可以將這些切分后的小文件重新組裝還原。例如,將上面的三個(gè)小文件還原為~/fstab.bak。
[root@linuxidc ~]# cat fs_0[0-2] ~/fstab.bak
還原后,它們的內(nèi)容是完全一致的??梢允褂胢d5sum比較。
[root@linuxidc ~]# md5sum /etc/fstab ~/fstab.bak
29b94c500f484040a675cb4ef81c87bf/etc/fstab
29b94c500f484040a675cb4ef81c87bf/root/fstab.bak
還可以將標(biāo)準(zhǔn)輸入的數(shù)據(jù)進(jìn)行切分,并分別寫入到小文件中。例如:
[root@linuxidc ~]# seq 1 2 15 | split -l 3 -d -new_
[root@linuxidc~]# ls new*new_00 new_01 new_02
可以為每個(gè)小文件追加額外的后綴。有些老版本的split不支持該選項(xiàng),而是在csplit上支持的,但是新版本的split已經(jīng)支持。例如,加上".log"。
[root@linuxidc ~]# seq 1 2 20 | split -l 3 -d -a 3 --additional-suffix=".log" -new1_
[root@linuxidc~]# ls new1*new1_000.log new1_001.log new1_002.log new1_003.log
1.3 csplit命令
split只能按行或按照大小進(jìn)行切分,無法按段落切分。csplit是split的變體,功能更多,它主要是按指定上下文按段落分割文件。
csplit [OPTION]... FILE PATTERN...
描述:按照PATTERN將文件切分為"xx00","xx01", ...,并在標(biāo)準(zhǔn)輸出中輸出每個(gè)小文件的字節(jié)數(shù)。
選項(xiàng)說明:-b FORMAT:指定文件后綴格式,格式為printf的格式,默認(rèn)為%02d。表示后綴以2位數(shù)值,且不足處以0填充。-f PREFIX:指定前綴,不指定是默認(rèn)為"xx"。-k:用于突發(fā)情況。表示即使發(fā)生了錯(cuò)誤,也不刪除已經(jīng)分割完成的小文件。-m:明確禁止文件的行去匹配PATTERN。-s:(silent)不打印小文件的文件大小。-z:如果切分后的小文件中有空文件,則刪除它們。
FILE:待切分的文件,如果要切分標(biāo)準(zhǔn)輸入數(shù)據(jù),則使用"-"。
PATTERNs:
INTEGER :數(shù)值,假如為N,表示拷貝1到N-1行的內(nèi)容到一個(gè)小文件中,其余內(nèi)容到另一個(gè)小文件中。/REGEXP/[OFFSET]:從匹配到的行開始按照偏移量拷貝指定行數(shù)的內(nèi)容到小文件中。
:其中OFFSET的格式為"+N"或"-N",表示向后和向前拷貝N行%REGEXP%[OFFSET]:匹配到的行被忽略。
{INTEGER} :假如值為N,表示重復(fù)N此前一個(gè)模式匹配。
{*} :表示一直匹配到文件結(jié)尾才停止匹配。
假設(shè)文件內(nèi)容如下:
[root@linuxidc ~]# cattest.txt
SERVER-1[connection]192.168.0.1success
[connection]192.168.0.2failed
[disconnect]192.168.0.3pending
[connection]192.168.0.4success
SERVER-2[connection]192.168.0.1failed
[connection]192.168.0.2failed
[disconnect]192.168.0.3success
[CONNECTION]192.168.0.4pending
SERVER-3[connection]192.168.0.1pending
[connection]192.168.0.2pending
[disconnect]192.168.0.3pending
[connection]192.168.0.4 failed
假設(shè)每個(gè)SERVER-n表示一個(gè)段落,于是要按照段落切分該文件,使用以下語句:
[root@linuxidc ~]# csplit -f test_ -b %04d.log test.txt /SERVER/ {*}0
140
139
140
"-f test_" 指定小文件前綴為"test_", "-b %04d.log" 指定文件后綴格式"00xx.log",它自動為每個(gè)小文件追加額外的后綴".log", "/SERVER/" 表示匹配的模式,每匹配到一次,就生成一個(gè)小文件,且匹配到的行是該小文件中的內(nèi)容, "{*}" 表示無限匹配前一個(gè)模式即/SERVER/直到文件結(jié)尾,假如不知道{*}或指定為{1},將匹配一次成功后就不再匹配。
[root@linuxidc ~]# ls test_*test_0000.log test_0001.log test_0002.log test_0003.log
上面的文件中雖然只有三個(gè)段落:SERVER-1,SERVER-2,SERVER-3,但切分的結(jié)果生成了4個(gè)小文件,并且注意到第一個(gè)小文件大小為0字節(jié)。為什么會如此?因?yàn)樵谀J狡ヅ涞臅r(shí)候,每匹配到一行,這一行就作為下一個(gè)小文件的起始行。由于此文件第一行"SERVER-1"就被/SERVER/匹配到了,因此這一行是作為下一個(gè)小文件的內(nèi)容,在此小文件之前還自動生成一個(gè)空文件。
生成的空文件可以使用"-z"選項(xiàng)來刪除。
[root@linuxidc ~]# csplit -f test1_ -z -b %04d.log test.txt /SERVER/ {*}140
139
140
還可以指定只拷貝匹配到的行偏移數(shù)量。例如,匹配到行時(shí),只拷貝它后面的1行(包括它自身共兩行),但多余的行將放入下一個(gè)小文件中。
[root@linuxidc ~]# csplit -f test2_ -z -b %04d.log test.txt /SERVER/+2 {*}42
139
140
98
第一個(gè)小文件只有兩行。
[root@linuxidc ~]# cattest2_0000.log
SERVER-1[connection]192.168.0.1 success
SERVER-1段落的其余內(nèi)容放入到了第二個(gè)小文件中。
[root@linuxidc ~]# cattest2_0001.log
[connection]192.168.0.2failed
[disconnect]192.168.0.3pending
[connection]192.168.0.4success
SERVER-2[connection]192.168.0.1 failed
同理第三個(gè)小文件也一樣,直到最后一個(gè)小文件中存放剩余所有無法匹配的內(nèi)容。
[root@linuxidc ~]# cattest2_0003.log
[connection]192.168.0.2pending
[disconnect]192.168.0.3pending
[connection]192.168.0.4 failed
指定"-s"或"-q"選項(xiàng)以靜默模式運(yùn)行,將不會輸出小文件的大小信息。
[root@linuxidc ~]# csplit -q -f test3_ -z -b %04d.log test.txt /SERVER/+2 {*}
1.分割 -- split命令
可以指定按行數(shù)分割和按字節(jié)大小分割兩種模式。
(1) 按行數(shù)分割
加上-d,使用數(shù)字后綴;加上--verbose,顯示分割進(jìn)度:
(2) 按字節(jié)大小分割
2.合并 -- cat命令
3 . 文件壓縮成 tar.gz
4 . 解壓縮?tar.gz文件
1)按2行切割 -l 2
2)指定切割后的文件前綴名 data_
3)指定切割后的文件后綴名為數(shù)字 -d
4)指定切割后的文件后綴名數(shù)字的長度? ? -a 4,即位寬(10進(jìn)制),這里長度可根據(jù)切割出來的文件有多少估算,到底拆分為幾個(gè)文件,由總行數(shù),和每個(gè)文件的行數(shù)決定,不用指定。
如果為-a 4文件的后綴數(shù)字從0000開始計(jì)算,依次為0001,0002,0003,0004
split -l 2 data.log -d -a 4 data_
將文件data.log進(jìn)行拆分,每個(gè)文件2行,如果文件總共有7行,則分為data_0000,data_0001,data_0002,data_0003
15 分鐘之后,我要去朋友家聚會。我打算從我的臺式機(jī)上把一部 700MB 大小的美國大片拷貝出來,帶到朋友家去看,可是我的兩個(gè)優(yōu)盤都只有 512MB,這讓我如何是好?
別急,用 10 分鐘趕快來認(rèn)識一下我們的 split 拆分小能手,一切問題將迎刃而解。當(dāng)遇到大文件而苦不堪言的時(shí)候,split 就會像天使一樣解救我們于水火之中。
合久必分
閑言少敘,我們現(xiàn)在就來介紹拆分的方法。先使用 dd 命令來生成一個(gè) 700MB 文件來作為我們的拆分對象:
美國大片的文件大小是 700MB,而我手邊僅有的兩個(gè)優(yōu)盤,都是 512MB 大小的。我打算把文件以 400MB 作為一個(gè)拆分單位,來進(jìn)行拆分。這里使用到了 split 的-b選項(xiàng),來指定每個(gè)拆分文件的大?。?/p>
看!分身完畢!咦,怎么多出了 xaa 和 xab 兩個(gè)文件,這么奇怪的名字?
是的,你沒看錯(cuò),在沒有明確指定拆分后文件的命名方式的情況下,split 會默認(rèn)采用 x 字符作為文件前綴,采用類似 aa、ab、ac 的字符串依次作為文件后綴。于是,就出現(xiàn)了我們上面看到的 xaa、xab 了。
從文件大小來看,如我們所愿,電影文件的確被切割成了一個(gè) 400MB 的文件、一個(gè) 300MB 的文件,終于可以裝到兩個(gè)優(yōu)盤里了。
知其然,知其所以然
知道了拆分命令后,我們來一起學(xué)習(xí)一下 split 的命令格式和常用選項(xiàng)。
split 的作用很好描述,就是將文件按照一定規(guī)則進(jìn)行拆分。一般情況下,我們可以按照文件大小來進(jìn)行拆分,如果是文本文件的話,還可以按照行數(shù)來進(jìn)行拆分,默認(rèn)是 1000 行作為一個(gè)拆分單位。
默認(rèn)情況下,分割后的文件的名稱會以 x 作為前綴,以 aa、ab、ac 這樣的雙字母格式作為后綴,形成 xaa、xab 這樣的名稱格式。
我們來一起看看 split 的命令格式:
split [-b ][-C ][-][-l ][要切割的文件][輸出文件名前綴][-a ]
最常用的選項(xiàng),都在這里了:
-b字節(jié):指定按多少字節(jié)進(jìn)行拆分,也可以指定 K、M、G、T 等單位。
-行數(shù)或-l行數(shù):指定每多少行要拆分成一個(gè)文件。
輸出文件名前綴:設(shè)置拆分后的文件的名稱前綴,split 會自動在前綴后加上編號,默認(rèn)從 aa 開始。
-a后綴長度:默認(rèn)的后綴長度是 2,也就是按 aa、ab、ac 這樣的格式依次編號。
分久必合
完成了美國大片的拆分,我趕赴朋友家,打開他的電腦,優(yōu)盤插上,使用 cat 命令將拆分文件 xaa 和 xab 合并成一個(gè)文件,可以看出合并后的文件和源文件的大小是一致的:
對了,如果是在 Windows 下的話,我們要先運(yùn)行 cmd,然后用 copy 命令來進(jìn)行文件的合并:
copy /b xaa + xab king_of_ring.avi
格式上和 Linux 有些區(qū)別,但原理是一樣的。
設(shè)置拆分文件的名稱前綴
上面例子中,我們沒有指定拆分文件的名稱前綴,結(jié)果拆分后的文件名都是 aa、ab 這樣的名稱,這樣的名稱既不達(dá)意也不美觀。
下面的例子,我們嘗試以 king_of_ring_part_ 作為拆分后文件的名稱前綴:
[root@roclinux ~]$ split -b 400m king_of_ring.avi king_of_ring_part_
文件名的可讀性是不是提高了不少,從文件名稱就可以看出來是美國大片的拆分文件啦。
設(shè)置數(shù)字后綴
如果大家看不慣以 aa、ab 這種字母作為文件后綴,我們還可以通過-d選項(xiàng)來指定數(shù)字形式的文件后綴:
[root@roclinux ~]$ split -b 400m -d king_of_ring.avi king_of_ring_part_
對于中國人來說,數(shù)字形式的后綴,增加了文件名稱的可讀性。
按照行數(shù)進(jìn)行拆分
前面我們講的是按照文件大?。ㄈ?400MB)進(jìn)行文件拆分的方法,但是并非所有情況都適合于用文件大小作為拆分單元。比如,我們希望把 /etc/passwd 文件按照一個(gè)文件 10 行記錄的方式進(jìn)行拆分,又該怎么操作呢?
[root@roclinux ~]$ split -d -10 /etc/passwd my_passwd_
合并后的校驗(yàn)不可少
需要注意的是,在通過網(wǎng)絡(luò)來傳輸大文件,或者在設(shè)備之間復(fù)制大文件的時(shí)候,可能會出現(xiàn)傳輸前后數(shù)據(jù)不一致的情況。
使用 split 來拆分大文件僅僅是故事的開始,操作完畢后化零為整、完璧歸趙才是完美的結(jié)局。因此需要在合并文件后進(jìn)行文件的完整性校驗(yàn),推薦使用 md5sum 來計(jì)算和比對前后兩個(gè)大文件的 md5 值。
如果前后一致,那么恭喜你,文件合并成功!
好了,split 學(xué)完了,我們也可以和朋友一起欣賞驚險(xiǎn)刺激的美國大片了!
文章標(biāo)題:linux分割文件命令 linux 文件拆分
路徑分享:http://sd-ha.com/article28/doijpjp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、App設(shè)計(jì)、品牌網(wǎng)站設(shè)計(jì)、品牌網(wǎng)站建設(shè)、移動網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)