Linux基礎(chǔ)命令之: Linux常用命令
2.1.4文件比較合并相關(guān)命令
1.diff
(1)作用。
比較兩個(gè)不同的文件或不同目錄下的兩個(gè)同名文件功能,并生成補(bǔ)丁文件。
(2)格式。
diff[選項(xiàng)]文件1文件2
diff比較文件1和文件2的不同之處,并按照選項(xiàng)所指定的格式加以輸出。diff的格式分為命令格式和上下文格式,其中上下文格式又包括了舊版上下文格式和新版上下文格式,命令格式分為標(biāo)準(zhǔn)命令格式、簡(jiǎn)單命令格式及混合命令格式,它們之間的區(qū)別會(huì)在使用實(shí)例中進(jìn)行詳細(xì)講解。當(dāng)選項(xiàng)缺省時(shí),diff默認(rèn)使用混合命令格式。
(3)主要參數(shù)。
diff主要選項(xiàng)參數(shù)如表2.26所示。
表2.26 diff命令常見(jiàn)參數(shù)列表
選項(xiàng) | 參數(shù)含義 |
-r | 對(duì)目錄進(jìn)行遞歸處理 |
-q | 只報(bào)告文件是否有不同,不輸出結(jié)果 |
-e,-ed | 命令格式 |
-f | RCS(修訂控制系統(tǒng))命令簡(jiǎn)單格式 |
-c,--context | 舊版上下文格式 |
-u,--unified | 新版上下文格式 |
-Z | 調(diào)用compress來(lái)壓縮歸檔文件,與-x聯(lián)用時(shí)調(diào)用compress完成解壓縮 |
(4)使用實(shí)例。
以下有兩個(gè)文件hello1.c和hello2.c。
/*hello1.c*/
#includestdio.h>
voidmain()
{
printf(Hello!Thisismyhome!n);
}
/*hello2.c*/
#includestdio.h>
voidmain()
{
printf(Hello!Thisisyourhome!n);
}
以下實(shí)例主要講解了各種不同格式的比較和補(bǔ)丁文件的創(chuàng)建方法。
①主要格式比較。
首先使用舊版上下文格式進(jìn)行比較。
[root@localhostdavid]#diff-chello1.chello2.c
***hello1.cSatJan1416:24:512006
---hello2.cSatJan1416:54:412006
***************
***1,5****
#includestdio.h>
voidmain()
{
!printf(Hello!Thisismyhome!n);
}
---1,5----
#includestdio.h>
voidmain()
{
!printf(Hello!Thisisyourhome!n);
}
可以看出,用舊版上下文格式進(jìn)行輸出時(shí),在顯示每個(gè)有差別行的同時(shí)還顯示該行的上下3行,區(qū)別的地方用“!”加以標(biāo)出,由于示例程序較短,上下3行已經(jīng)包含了全部代碼。
接著使用新版的上下文格式進(jìn)行比較。
[root@localhostdavid]#diff-uhello1.chello2.c
---hello1.cSatJan1416:24:512006
+++hello2.cSatJan1416:54:412006
@@-1,5+1,5@@
#includestdio.h>
voidmain()
{
-printf(Hello!Thisismyhome!n);
+printf(Hello!Thisisyourhome!n);
}
可以看出,在新版上下文格式輸出時(shí),僅把兩個(gè)文件的不同之處分別列出,而相同之處沒(méi)有重復(fù)列出,這樣大大方便了用戶的閱讀。
接下來(lái)使用命令格式進(jìn)行比較。
[root@localhostdavid]#diff-ehello1.chello2.c
4c
printf(Hello!Thisisyourhome!n);
可以看出,命令符格式輸出時(shí)僅輸出了不同的行,其中命令符“4c”中的數(shù)字表示行編號(hào),字母的含義為:a表示添加,b表示刪除,c表示更改。因此,-e選項(xiàng)的命令符表示:若要把hello1.c變?yōu)閔ello2.c,就需要把hello1.c的第4行改為顯示出的“printf(“Hello!Thisisyourhome!n”);”。
選項(xiàng)“-f”和選項(xiàng)“-e”顯示的內(nèi)容基本相同,就是數(shù)字和字母的順序相交換了,從以下的輸出結(jié)果可以看出。
[root@localhostdavid]#diff-fhello1.chello2.c
c4
printf(Hello!Thisisyourhome!n);
在diff選項(xiàng)缺省的情況下,輸出結(jié)果如下所示。
[root@localhostdavid]#diffhello1.chello2.c
4c4
printf(Hello!Thisismyhome!n);
---
>printf(Hello!Thisisyourhome!n);
可以看出,diff缺省情況下的輸出格式充分顯示了如何將hello1.c轉(zhuǎn)化為hello2.c,即通過(guò)“4c4”實(shí)現(xiàn)。
②創(chuàng)建補(bǔ)丁文件(也就是差異文件)是diff的功能之一,不同的選項(xiàng)格式可以生成與之相對(duì)應(yīng)的補(bǔ)丁文件,如下面扔例子所示。
[root@localhostdavid]#diffhello1.chello2.c>hello.patch
[root@localhostdavid]#vihello.patch
4c4
printf(Hello!Thisismyhome!n);
---
>printf(Hello!Thisisyourhome!n);
可以看出,使用缺省選項(xiàng)創(chuàng)建補(bǔ)丁文件的內(nèi)容和前面使用缺省選項(xiàng)的輸出內(nèi)容是一樣的。
小知識(shí) | 上例中所使用的”>“是輸出重定向。通常在Linux上執(zhí)行一個(gè)shell命令行時(shí),會(huì)自動(dòng)打開(kāi)3個(gè)標(biāo)準(zhǔn)文件:標(biāo)準(zhǔn)輸入文件(stdin),即通常對(duì)應(yīng)終端的鍵盤(pán);標(biāo)準(zhǔn)輸出文件(stdout)和標(biāo)準(zhǔn)錯(cuò)誤輸出文件(stderr),前兩個(gè)文件都對(duì)應(yīng)終端的屏幕。進(jìn)程將從標(biāo)準(zhǔn)輸入文件中得到輸入數(shù)據(jù),并且將正常輸出數(shù)據(jù)輸出到標(biāo)準(zhǔn)輸出文件,而將錯(cuò)誤信息送到標(biāo)準(zhǔn)錯(cuò)誤文件中。這就是通常使用的標(biāo)準(zhǔn)輸入/輸出方式。 直接使用標(biāo)準(zhǔn)輸入/輸出文件存在以下問(wèn)題:首先,用戶輸入的數(shù)據(jù)只能使用一次。當(dāng)下次希望再次使用這些數(shù)據(jù)時(shí)就不得不重新輸入。同樣,用戶對(duì)輸出信息不能做更多的處理,只能等待程序的結(jié)束。 為了解決上述問(wèn)題,Linux系統(tǒng)為輸入、輸出的信息傳送引入了兩種方式:輸入/輸出重定向機(jī)制和管道(在1.3.1的小知識(shí)中已有介紹)。其中,輸入重定向是指把命令(或可執(zhí)行程序)的標(biāo)準(zhǔn)輸入重定向到指定的文件中。也就是說(shuō),輸入可以不來(lái)自鍵盤(pán),而來(lái)自一個(gè)指定的文件。同樣,輸出重定向是指把命令(或可執(zhí)行程序)的標(biāo)準(zhǔn)輸出或標(biāo)準(zhǔn)錯(cuò)誤輸出重新定向到指定文件中。這樣,該命令的輸出就可以不顯示在屏幕上,而是寫(xiě)入到指定文件中。就如上述例子中所用到的把“diffhello1.chello2.c”的結(jié)果重定向到hello.patch文件中。這就大大增加了輸入/輸出的靈活性。 |
評(píng)論